我想了解的變體是如何實現的,以及閱讀:C++模板變體中的類型數量是否有限?
http://www.codeproject.com/KB/cpp/TTLTyplist.aspx
而且我收到我不能寫一個變種,採用X型的印象;但是模板編寫者選擇了一些N,並且我只能在一個變體中使用小於N的類型。
這是正確的嗎?
謝謝!
我想了解的變體是如何實現的,以及閱讀:C++模板變體中的類型數量是否有限?
http://www.codeproject.com/KB/cpp/TTLTyplist.aspx
而且我收到我不能寫一個變種,採用X型的印象;但是模板編寫者選擇了一些N,並且我只能在一個變體中使用小於N的類型。
這是正確的嗎?
謝謝!
在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)
根據現行標準,這是正確的;模板只能有固定數量的參數,而庫使用預處理器元編程等技術來模擬可變參數模板參數達到某個設定的最大值。通常情況下,這在實踐中並不是什麼大問題,因爲最大值被設置得遠遠高於大多數人使用的。
在新的0x標準中,支持真正的可變參數模板參數。
是的 - 這個庫的實現有一些限制。 IIRC,在Loki中默認最大值爲99。看了那篇文章,他把限制設定爲5,這可能足以做很多工作,但我可以看到超過它的可能性;我無法想象超出99 Loki允許的範圍(儘管在任何情況下,如果你願意,延長限制是一項簡單的編輯工作)。
沒有可變參數模板支架,模板創作者只能提供解決方法,看起來像可變參數模板:
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 {};
那實際上是第一個可以接受的可讀使用Boost.PP我見過他們的教程之外。 –
@gf:哈哈。:P這個(「可變參數」模板)和你在另一個問題上指出的計數器是迄今爲止我唯一的兩個實際使用。 – GManNickG