我最近开始使用 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/