可变长度模板参数列表?

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)

  • 如果我没弄错的话,你还需要解压缩类型:`public T ... {};` (13认同)