来自c ++中const数组的平均值的模板

时间:2015-04-19 18:18:20

标签: c++ arrays templates

我在c ++中有以下模板用于计算平均值:

template <typename T>
T average(T t[], int n)
{
    T s = t[n - 1];
    for (int i = 0; i < (n-1); i++)
        s += t[i];
    return s / n;
}

但是当我尝试使用常量数组调用函数时,我有一个错误,例如:

const double array[5] = { 23.4, 523.5, 55.2, 543.2, 6.4 };
double a = average(array,5);
  

错误C3892:'s':您无法分配给const

的变量

如何定义此模板以从常量数组​​计算?

2 个答案:

答案 0 :(得分:7)

实际上,你的函数需要一个指针,而不是一个数组。由于历史原因,参数列表中的T t[]T* t相同。

只需将指针指向const而不是指向非const指针:

template <typename T>
T average(T const* t, int n) {
    T s = t[n - 1];
    for (int i = 0; i < (n-1); i++)
        s += t[i];
    return s / n;
}

或者,更好的是,使用迭代器对,这样就可以将它与任何容器一起使用,而不仅仅是C风格的数组:

template <typename It>
auto average(It begin, It end) {
    assert(begin != end);
    auto s = std::accumulate(begin, end, 0.0);
    return s / std::distance(begin, end);
}

const double array[] = { 23.4, 523.5, 55.2, 543.2, 6.4 };
double a = average(std::begin(array), std::end(array));

答案 1 :(得分:1)

您可以按以下方式使用类型特征

#include <iostream>
#include <type_traits>

template <typename T>
T average(T t[], int n)
{
    typename std::remove_const<T>::type  s = t[n - 1];
    for (int i = 0; i < (n-1); i++)
        s += t[i];
    return s / n;
}

int main()
{
    const double array[5] = { 23.4, 523.5, 55.2, 543.2, 6.4 };
    double a = average(array,5);
}

虽然你的功能看起来很奇怪。考虑到一般情况下参数n可以等于零。在这种情况下,您的功能将无效。