数组元素到Variadic模板参数

时间:2017-02-21 16:21:47

标签: c++ c++11 variadic-templates

我有一个关于如何完成以下行为的问题,或者在C ++中是否可行。假设我有这种可变函数

template<typename T, typename...Pack>
T sum(T a, Pack... pack) {
    return a + sum(pack...);
}

template<typename T>
T sum(T a) {
    return a;
}

然后我有一个数组

double array[5];

有没有办法可以去做像

这样的事情
sum(array[0], array[1], array[2], array[3], array[4]);

没有明确地在每个元素中进行硬编码?原因,我正在尝试实现诸如

之类的东西
double array[N];
sum(array[0], array[1], array[2], ..., array[N-1]);

其中N在编译时设置。

1 个答案:

答案 0 :(得分:5)

你可以借助索引序列技巧:

template <class T, size_t N, size_t... Is>
T array_sum_impl(T (&arr)[N], std::index_sequence<Is...>) {
    return sum(arr[Is]...);
}

template <class T, size_t N>
T array_sum(T (&arr)[N]) {
    return array_sum_impl(arr, std::make_index_sequence<N>{});
}

但是做正常事情可能会更好:

auto sum = std::accumulate(std::begin(array), std::end(array), 0.0);