2010-01-25 23 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 {}; 
相關問題