2010-01-25 68 views

回答

4

在C++ 03中,没有可变参数模板。这意味着是的;你只需要选择一些N来参与,并与之共存。

在C++ 0x中,将有可变参数模板,所以你可以使用一个定义所有X.

如果你正在寻找使换号轻松,你可以使用Boost.Preprocessor,并让它做为您的工作:

#define MAXIMUM_TYPELIST_SIZE 20 // or something 

struct empty{}; 

template <BOOST_PP_ENUM_BINARY_PARAMS(MAXIMUM_TYPELIST_SIZE, typename T, =empty)> 
struct typelist; 

template <BOOST_PP_ENUM_PARAMS(MAXIMUM_TYPELIST_SIZE, typename T)> 
struct typelist 
{ 
    typedef T1 head; 
    typedef typelist< 
      BOOST_PP_ENUM_PARAMS(BOOST_PP_DEC(MAXIMUM_TYPELIST_SIZE), T)> tail; 
    enum 
    { 
    length = tail::length+1 
    }; 
}; 

如果MAXIMUM_TYPELIST_SIZE是5,那些宏将扩大到文章的内容。

(当然,如果你使用升压只是用自己的meta-programming library

+0

那实际上是第一个可以接受的可读使用Boost.PP我见过他们的教程之外。 –

+0

@gf:哈哈。:P这个(“可变参数”模板)和你在另一个问题上指出的计数器是迄今为止我唯一的两个实际使用。 – GManNickG

1

根据现行标准,这是正确的;模板只能有固定数量的参数,而库使用预处理器元编程等技术来模拟可变参数模板参数达到某个设定的最大值。通常情况下,这在实践中并不是什么大问题,因为最大值被设置得远远高于大多数人使用的。

在新的0x标准中,支持真正的可变参数模板参数。

2

是的 - 这个库的实现有一些限制。 IIRC,在Loki中默认最大值为99。看了那篇文章,他把限制设定为5,这可能足以做很多工作,但我可以看到超过它的可能性;我无法想象超出99 Loki允许的范围(尽管在任何情况下,如果你愿意,延长限制是一项简单的编辑工作)。

2

没有可变参数模板支架,模板创作者只能提供解决方法,看起来像可变参数模板:

template<class Arg1=nil, class Arg2=nil /* , ... */> 
struct foo {}; 

这里作者提供的模板参数数量是限制。

如果他们不提供这样的变通,你会被迫采取明确的类型串,这是非常笨拙的比较:

typedef list<T1, list<T2, list<T3, nil> > > myTypeList; 
foo<myTypeList>::bar; 

这些不局限于固定数量的类型,但不是我想明确使用的东西。

有了一个C++标准,这将具有真正的可变参数模板来解决:

template<class... Args> // can take 0..n arguments 
struct foo {}; 
相关问题