可变长度模板参数列表?(Variable length template arguments lis

2019-08-17 05:37发布

我记得seing这样的事情正在做:

template <ListOfTypenames>
class X : public ListOfTypenames {};

即,X从作为模板参数传递typenames的可变长度列表继承。 此代码是假想的,当然。

我找不到这方面的任何引用,虽然。 可能吗? 难道的C ++ 0x?

Answer 1:

您可以在当前的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 {};

或者你也可以变得更加复杂,并使用递归。 首先,你向前声明模板:

class nothing {};

template <class T1 = nothing, class T2 = nothing, class T3 = nothing>
class X;

然后你专注的,所有的参数都是默认的情况下:

template <>
class X<nothing, nothing, nothing> {};

然后你正确定义的通用模板(这在以前你只能向前声明):

template <class T1, class T2, class T3>
class X : public T1, public X<T2, T3>

请注意,在基类,你继承了X,但你错过了第一个参数。 于是他们沿着一个地方的所有幻灯片。 最终,他们都将默认值,专业化会踢,不继承任何东西,从而终止递归。

更新:只是有一种奇怪的感觉,我会发布这样的事情之前, 你猜怎么着?



Answer 2:

听起来像是你是指的C ++ 0x 可变参数模板 。 您也可以使用Alexandrescu的公司达到同样的效果TYPELIST从结构洛基 。

我相信有关的可变参数模板语法看起来像下面这样。

template <typename...T>
class X : public T... {};


Answer 3:

正如其他人已经回答了,可变参数模板是一个标准的一部分,但在当前的C ++进行仿真。 这样做的一个方便的工具是使用Boost.MPL库。 在你的代码,你写一个模板参数(让我们将其命名为“类型串”),以及您的模板的用户包装类型串在MPL序列。 例:

#include "YourType.h"
#include "FooBarAndBaz.h"
#include <boost/mpl/vector.hpp>

YourType<boost::mpl::vector<Foo, Bar, Baz> > FooBarBaz;

在“YourType”的执行情况,您可以访问类型串的元素与不同的元函数。 例如, at_c<Typelist, N>N个列表的元素。 再举一个例子,在你的问题中的“X”类可以用写inherit_linearly为:

//Warning: Untested
namespace bmpl = boost::mpl;
template<class Typelist>
class X : bmpl::inherit_linearly<Typelist, bmpl::inherit<bmpl::_1, bmpl::_2> >::type
{
...
};


Answer 4:

的模板变量数目是下一个C ++标准的一部分。 但是,你可以,如果你使用GCC(4.3版)获得它的味道。 这里有一个在GCC提供的C ++ 0x功能列表 。 你要找的可变参数模板。

顺便说一句,如果你需要由埃里克描述如何实现继承机制正式的参考,这是书上的C ++模板 。



文章来源: Variable length template arguments list?