c++ - 给定大小 N 和类型 T 生成元组的函数

标签 c++ templates c++14 variadic-templates stdtuple

在尝试回复 this question 时,我发现自己需要动态地为可变参数函数创建一堆参数,其中:

  • 未给出参数个数
  • 类型都相同,但未知(即使它们必须是默认可构造的)

在运行时,标准容器for循环可用于执行此操作。
无论如何,我想在编译时生成一组参数,以便能够将它们转发给可变参数函数。
因此,std::tuple 似乎是显而易见的解决方案。

这里出现了一个问题:在编译时给定一个大小 N 和一个默认的可构造类型 T,我如何编写一个函数来生成给定大小的元组?

我正在寻找这样的东西:

auto tup = gen<MyType, N>();

在 SO 上是一个 notable example一个基于递归生成器的结构,但我一直在努力寻找一个基于函数的解决方案,但我无法在任何地方找到它。

最佳答案

正确编写的转发函数(la std::apply )应该与 std::array<T, N> 一起工作以及任何其他实现 std::tuple_size 的东西/std::get界面。也就是说,

template<size_t, class T>
using T_ = T;

template<class T, size_t... Is>
auto gen(std::index_sequence<Is...>) { return std::tuple<T_<Is, T>...>{}; }

template<class T, size_t N>
auto gen() { return gen<T>(std::make_index_sequence<N>{}); } 

关于c++ - 给定大小 N 和类型 T 生成元组的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37093920/

相关文章:

c++ - 如何在 C++ 中显式实例化模板 constexpr 变量?

c++ - 如何在不降级为基类的情况下制作*对象的 vector

c++ - 如何在 C++ 中递归反转负整数?

templates - Yesod (hamlet) 模板中的注释语法是什么?

c++ - 为什么在这个例子中没有应用 SFINAE?

c++ - 如何编写 Lambda 包装具有可选返回值的函数

c++ - std::cout 中的递归打印

c++ - 禁止使用模板化的虚拟成员函数,有替代方法吗?

c++ - 类模板方法的特化,类型名称是类模板 - 错误 : type/value mismatch at argument

c++ - std::atomic 平凡可复制结构