Ron*_*nis 11 c++ variadic-templates c++11
我最近开始使用C++ 11,我已经阅读了关于可变参数模板的教程.我已经明白我们可以像这样定义一个可变参数模板
// example class that uses variadic template
template<typename ...Args> struct mtuple;
Run Code Online (Sandbox Code Playgroud)
但是我如何处理类的模板参数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>,可以通过向上转换获得,然后返回B该基类的成员。
[编辑:get<1>(m)需要知道B与索引为 1 的元组元素对应的类型,因为您使用类似的东西std::tuple_element也依赖于上面描述的递归继承层次结构,并使用部分特化来获取索引TupleHead<1,T>为 1 的基类,然后确定该部分专业化中的参数,在我的示例中T给出。]B
可变参数模板使用的许多技术都是函数式编程技术,例如对模板参数包的第一个元素进行操作,然后对包的其余部分递归地执行相同的操作,直到处理完所有元素。除了计算其大小(使用 )或用它实例化另一个模板之外,您可以直接使用模板参数包做的事情并不多sizeof...,因此通常的方法是实例化另一个模板,将包分成Args并ArgHead, ArgsTail...处理头部,然后递归做同样的事情ArgsTail