当前位置:  开发笔记 > 编程语言 > 正文

如何将向量元素作为参数传递给可变参数模板函数?

如何解决《如何将向量元素作为参数传递给可变参数模板函数?》经验,为你挑选了1个好方法。

所以,假设我有这个代码:

template 
auto 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一种传递向量的方式调用函数:

vector numbers = { 1, 2, 6, 5 };

应该用作函数的参数列表sum.我怎样才能做到这一点?sum在这种情况下,调用函数应返回14.



1> 101010..:

std::vector是一个运行时的野兽.也就是说,它在堆上分配缓冲区,通常在运行时允许任何操作.另一方面,可变参数模板"pealing"在编译期间完成.因此,a std::vector和可变参数模板有点"不相交".因此,用矢量做你想做的事是不可能的.

如果要对向量的元素求和,可以使用std::accumulate以下命令在运行时完成:

std::vector 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 
constexpr 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函数的参数.

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有