c++ - 在 C++11 中处理可变参数模板

标签 c++ c++11 variadic-templates

我最近开始使用 C++11,并且阅读了有关可变参数模板的教程。我明白我们可以像这样定义一个可变参数模板

// example class that uses variadic template
template<typename ...Args> struct mtuple;

但是我该如何处理 mtuple 的模板参数呢?类(即 get<int>(mtuple_obj) 会是什么样子?)?

最佳答案

什么 get<1>(t)看起来将取决于 mtuple 的实现.典型的实现递归继承自包含每个参数的类型,因此 mtuple<A,B,C>继承自 TupleHead<A> (它有一个 A 类型的成员)并且还继承自 TupleTail<B,C> . TupleTail<B,C>继承自 TupleHead<B> (它有一个 B 类型的成员)和 TupleTail<C> . TupleTail<C>继承自 TupleHead<C> (它有一个 C 类型的成员。)

现在,如果你也给每个基类一个整数参数:

mtuple<A,B,C>继承自 TupleHead<0,A>TupleTail<1,B,C>

TupleTail<1,B,C>继承自 TupleHead<1,B>TupleTail<2,C>

TupleTail<2,C>继承自 TupleHead<2,C>

现在写起来比较简单get<1> ,因为 mtuple有一个类型为 TupleHead<1,B> 的唯一基类可以通过upcast获得,然后返回B该基类的成员。

[编辑:get<1>(m)需要知道类型 B对应于索引为 1 的元组元素,为此你使用类似 std::tuple_element 的东西这也依赖于上述递归继承层次结构,并使用部分特化来获得 TupleHead<1,T>索引为 1 的基类,然后确定参数 T在那个部分特化中,它给出了 B在我的例子中。]

可变参数模板使用的许多技术都是函数式编程技术,例如对模板参数包的第一个元素进行操作,然后递归地对包的其余部分执行相同的操作,直到处理完所有元素.除了计算其大小(使用 sizeof... )或用它实例化另一个模板之外,您可以直接使用模板参数包做很多事情,因此通常的方法是实例化另一个模板来分隔包 Args进入ArgHead, ArgsTail...并处理头部,然后递归地对 ArgsTail 执行相同的操作

关于c++ - 在 C++11 中处理可变参数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10437315/

相关文章:

c++ - 使用 {} 的函数重载解析

c++ - 检查子类型时特化方法模板

c++ - 返回对本地对象的引用的函数

c++ - 如何更改 VS 2012 中 WP8 C++ 组件中的 $(RootNamespace) 宏?

c++ - 如何在opencv中使用SIFT

c++ - 如何解释标准中的以下段落?

c++ - 为什么没有选择模板特化?

C++ 在折叠运算符中迭代元组

c++ - 以模板函数作为参数的可变参数模板函数

c++ - 我怎样才能让我的函数返回 true 或 false