我有一個工廠類,它需要使用連續的模板參數(它們是簡單的整數)實例化幾個模板。如何在不展開整個循環的情況下實例化這些模板函數?C++在循環中實例化模板
唯一能想到的就是使用boost預處理器。你能推薦別的東西,它不依賴於預處理器嗎?
感謝
我有一個工廠類,它需要使用連續的模板參數(它們是簡單的整數)實例化幾個模板。如何在不展開整個循環的情況下實例化這些模板函數?C++在循環中實例化模板
唯一能想到的就是使用boost預處理器。你能推薦別的東西,它不依賴於預處理器嗎?
感謝
模板參數必須是編譯時常量。目前沒有編譯器認爲循環計數器變量是一個常量,即使它展開之後。這可能是因爲在模板瞬時化期間必須知道常量,這在發生循環展開之前就已經發生了。
但是有可能構建一個「遞歸」模板,並將專業化作爲結束條件。但即使如此,循環邊界需要編譯時間不變。
template<int i>
class loop {
loop<i-1> x;
}
template<>
class loop<1> {
}
loop<10> l;
將創建一個從環< 10 10模板類>循環< 1>。
我不認爲這是可能的運行時間,因爲MyClass<1>
和MyClass<2>
是絕對不同的類。
但我有一個想法:如果你知道所有可能的值,那麼你可以在你的工廠類中編寫一個switch
並將這個整數作爲參數傳遞給工廠。
如果你使用開關方式,那麼所有的類都將被實例化。沒有辦法只實例化一個等於'n'的東西(因爲它的值在編譯時是不知道的)。 – 2009-11-21 13:56:13
它可能可以使用Boost metaprogramming library完成。但是,如果你以前沒有使用過它或者被用來做過多的模板編程,它可能不值得需要學習如何去做的工作量。
謝謝你們。
赫希博士是最接近需要的,但最終的前任解決方案是最乾淨的。讓我重申這個問題:需要一些模板是在編譯時使用常量參數
f0 = f<0,0>();
f1 = f<0,1>();
...
fk = f<m,n>();
爲m的任何顯著數量被實例化,和正展開模板創建使代碼忙碌。使用升壓預處理器我做了以下操作:
#include "boost/preprocessor/seq/for_each_product.hpp"
#include "boost/preprocessor/seq/to_tuple.hpp"
#define SEQ_MASK (0x1)(0x3)
#define SEQ_M (1)(2)
#define SEQ_N (1)(2)
#define INSTANCE(r, tparams) { \
Kernel kernel = Instance<BOOST_PP_SEQ_ENUM(tparams)>(); \
kernels[kernel.key()] = kernel; }
BOOST_PP_SEQ_FOR_EACH_PRODUCT(INSTANCE, (SEQ_MASK)(SEQ_M)(SEQ_N));
預處理器運行後,它會產生所有定義的三個序列的組合。
你可以發表一些說明你想要的代碼嗎? *你如何*實例化模板? – 2009-11-21 08:49:31