sol*_*old 10 c++ templates variable-length c++11
我记得做过这样的事情:
template <ListOfTypenames>
class X : public ListOfTypenames {};
Run Code Online (Sandbox Code Playgroud)
也就是说,X继承自作为模板参数传递的可变长度的类型名列表.当然,这段代码是假设的.
但是我找不到任何参考.可能吗?是C++ 0x吗?
Dan*_*ker 23
你可以用当前的C++做到这一点.您为模板提供了"足够大"的参数,并为它们提供默认值:
class nothing1 {};
class nothing2 {};
class nothing3 {};
template <class T1 = nothing1, class T2 = nothing2, class T3 = nothing3>
class X : public T1, public T2, public T3 {};
Run Code Online (Sandbox Code Playgroud)
或者你可以变得更复杂并使用递归.首先你转发声明模板:
class nothing {};
template <class T1 = nothing, class T2 = nothing, class T3 = nothing>
class X;
Run Code Online (Sandbox Code Playgroud)
然后,您专门研究所有参数都是默认的情况:
template <>
class X<nothing, nothing, nothing> {};
Run Code Online (Sandbox Code Playgroud)
然后你正确定义了一般模板(之前你只是前向声明):
template <class T1, class T2, class T3>
class X : public T1, public X<T2, T3>
Run Code Online (Sandbox Code Playgroud)
请注意,在基类中,您是如何继承X但却错过了第一个参数.所以他们都沿着一个地方滑行.最终它们都将是默认值,并且特化将启动,它不会继承任何内容,从而终止递归.
更新:只是有一种奇怪的感觉我之前发过这样的东西,猜猜是什么......
Ste*_*idi 19
听起来像是指C++ 0x Variadic模板.您也可以使用Loki的 Alexandrescu的TypeList构造实现相同的效果.
我相信有问题的可变参数模板语法如下所示.
template <typename...T>
class X : public T... {};
Run Code Online (Sandbox Code Playgroud)