std::vector
是一个运行时间的野兽。也就是说,它在堆上分配缓冲区,通常在运行时允许任何操作。另一方面,可变参数模板“剥离”在编译期间完成。因此,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);
布赖恩在评论中提到的,你可以结合使用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>{});
}
Live Demo
在上面的例子中,我打上你的sum
功能constexpr
。您还可以了解如何使用std::make_index_sequence
将数组的元素作为参数提供给可变参数sum
函数。
变量函数在编译时解析,向量具有运行时确定的大小。相反,也许你应该专注于向量参数。 – jaggedSpire
你也可以使用std :: array,它的大小在编译时已知。 – Brian
@Claudiu仅供参考:您的链接指向此处。 ;-) – jaggedSpire