我记得seing这样的事情正在做:
template <ListOfTypenames>
class X : public ListOfTypenames {};
即,X从作为模板参数传递typenames的可变长度列表继承。 此代码是假想的,当然。
我找不到这方面的任何引用,虽然。 可能吗? 难道的C ++ 0x?
我记得seing这样的事情正在做:
template <ListOfTypenames>
class X : public ListOfTypenames {};
即,X从作为模板参数传递typenames的可变长度列表继承。 此代码是假想的,当然。
我找不到这方面的任何引用,虽然。 可能吗? 难道的C ++ 0x?
您可以在当前的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,但你错过了第一个参数。 于是他们沿着一个地方的所有幻灯片。 最终,他们都将默认值,专业化会踢,不继承任何东西,从而终止递归。
更新:只是有一种奇怪的感觉,我会发布这样的事情之前, 你猜怎么着?
听起来像是你是指的C ++ 0x 可变参数模板 。 您也可以使用Alexandrescu的公司达到同样的效果TYPELIST从结构洛基 。
我相信有关的可变参数模板语法看起来像下面这样。
template <typename...T>
class X : public T... {};
正如其他人已经回答了,可变参数模板是一个标准的一部分,但在当前的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
{
...
};
的模板变量数目是下一个C ++标准的一部分。 但是,你可以,如果你使用GCC(4.3版)获得它的味道。 这里有一个在GCC提供的C ++ 0x功能列表 。 你要找的可变参数模板。
顺便说一句,如果你需要由埃里克描述如何实现继承机制正式的参考,这是书上的C ++模板 。