所以,假设我有这个代码:
templateauto sum(T1 a, T2 b) ->decltype(a + b) { return a + b; } template auto sum(T1 a, T2 b, T3... tail) ->decltype(a + sum(b, tail...)) { return a + sum(b, tail...); }
我想以sum
一种传递向量的方式调用函数:
vectornumbers = { 1, 2, 6, 5 };
应该用作函数的参数列表sum
.我怎样才能做到这一点?sum
在这种情况下,调用函数应返回14.
std::vector
是一个运行时的野兽.也就是说,它在堆上分配缓冲区,通常在运行时允许任何操作.另一方面,可变参数模板"pealing"在编译期间完成.因此,a std::vector
和可变参数模板有点"不相交".因此,用矢量做你想做的事是不可能的.
如果要对向量的元素求和,可以使用std::accumulate
以下命令在运行时完成:
std::vectorv{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 { templateconstexpr auto sum_(T1 a, T2 b) { return a + b; } template constexpr auto sum_(T1 a, T2 b, T3... tail) { return a + sum_(b, tail...); } template constexpr T sum_impl(std::array const &src, std::index_sequence ) { return sum_(src[Is]...); } } template constexpr T sum(std::array const &arr) { return detail::sum_impl(arr, std::make_index_sequence {}); }
现场演示
在上面的例子中,我标记了你的sum
功能constexpr
.您还可以弄清楚如何使用std::make_index_sequence
数组元素作为可变参数sum
函数的参数.