所以,让我们说我有这个代码:
template <class T1, class T2>
auto sum(T1 a, T2 b) ->decltype(a + b) {
return a + b;
}
template <class T1, class T2, class... T3>
auto sum(T1 a, T2 b, T3... tail) ->decltype(a + sum(b, tail...)) {
return a + sum(b, tail...);
}
我想以传递向量的方式调用函数sum
:
vector<double> numbers = { 1, 2, 6, 5 };
应该用作函数sum
的参数列表。我怎样才能做到这一点?在这种情况下,调用函数sum
应该返回14。
答案 0 :(得分:9)
std::vector
是一个运行时的野兽。也就是说,它在堆上分配缓冲区,通常在运行时允许任何操作。另一方面,可变参数模板“pealing”在编译期间完成。因此,std::vector
和可变参数模板在某种程度上是“不相交的”。因此,用矢量做你想做的事情是不可能的。
如果要对向量的元素求和,可以使用std::accumulate
在运行时完成:
std::vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int sum = std::accumulate(v.begin(), v.end(), 0);
正如Brian在评论中提到的,您可以使用std::array
结合constexpr
函数进行编译时计算。下面显示了如何执行此操作的示例:
namespace detail {
template <class T1, class T2>
constexpr auto sum_(T1 a, T2 b) {
return a + b;
}
template <class T1, class T2, class... T3>
constexpr auto sum_(T1 a, T2 b, T3... tail) {
return a + sum_(b, tail...);
}
template <typename T, std::size_t N, std::size_t... Is>
constexpr T sum_impl(std::array<T, N> const &src, std::index_sequence<Is...>) {
return sum_(src[Is]...);
}
}
template <typename T, std::size_t N>
constexpr T sum(std::array<T, N> const &arr) {
return detail::sum_impl(arr, std::make_index_sequence<N>{});
}
在上面的示例中,我标记了您的sum
函数constexpr
。您还可以弄清楚如何使用std::make_index_sequence
将数组元素作为变量sum
函数的参数提供。