开发者问题收集

将数组传递到模板功能中

2012-11-22
1527

我正在尝试制作一个以数组为参数的模板函数。该函数返回数组中数字的总和。

这是我的代码:

template <class var>
var sum_numbers(var array[]) {
    var sum = 0;
    for (int f1=0; array[f1]!='\0'; f1++) {
        sum = sum + array[f1];
    }
    return sum;
}

该函数始终返回

-2001120059

您能否提供一些如何改进我的代码的建议,以及您能否给我一些参考,告诉我在哪里可以找到有关模板的更多信息?

非常感谢。

更新: 我的输入和函数调用:

int a[] = {1,2,3,4,5};
cout << sum_numbers(a) << endl;
1个回答

您的代码似乎期望数组以零结尾。但并不能保证这一点。这只发生在字符串文字中。您的函数实际上不接受数组,而是接受指针。您不能按值获取数组,但如果您想按引用获取数组,您可以这样做:

template <class var, size_t N>
var sum_numbers(var (&array)[N]) {
    var sum = 0;
    for (size_t f1=0; f1<N; f1++) {
        sum = sum + array[f1];
    }
    return sum;
}

或者,更简洁地说:

template<typename T, size_t N>
T sum_numbers(T (&arr)[N]) {
    return std::accumulate(arr, arr + N, T());
}

或者,如果您想完全通用,并且对 C++11 有良好的支持:

template<typename C>
auto sum_numbers(C const & c)
    -> typename std::remove_reference<decltype(*std::begin(c))>::type
{
    typedef typename std::remove_reference<decltype(*std::begin(c))>::type value_type;
    return std::accumulate(std::begin(c), std::end(c), value_type());
}

can you please give me some reference where to find more information about templates?

请参阅[ 此列表 ]中的中级和高级书籍。即使是初学者书籍也应该至少为您提供介绍。

Benjamin Lindley
2012-11-22