2009-11-21 161 views
4

我有一個工廠類,它需要使用連續的模板參數(它們是簡單的整數)實例化幾個模板。如何在不展開整個循環的情況下實例化這些模板函數?C++在循環中實例化模板

唯一能想到的就是使用boost預處理器。你能推薦別的東西,它不依賴於預處理器嗎?

感謝

+6

你可以發表一些說明你想要的代碼嗎? *你如何*實例化模板? – 2009-11-21 08:49:31

回答

8

模板參數必須是編譯時常量。目前沒有編譯器認爲循環計數器變量是一個常量,即使它展開之後。這可能是因爲在模板瞬時化期間必須知道常量,這在發生循環展開之前就已經發生了。

但是有可能構建一個「遞歸」模板,並將專業化作爲結束條件。但即使如此,循環邊界需要編譯時間不變。

template<int i> 
class loop { 
    loop<i-1> x; 
} 

template<> 
class loop<1> { 
} 

loop<10> l; 

將創建一個從環< 10 10模板類>循環< 1>。

0

我不認爲這是可能的運行時間,因爲MyClass<1>MyClass<2>是絕對不同的類。

但我有一個想法:如果你知道所有可能的值,那麼你可以在你的工廠類中編寫一個switch並將這個整數作爲參數傳遞給工廠。

+0

如果你使用開關方式,那麼所有的類都將被實例化。沒有辦法只實例化一個等於'n'的東西(因爲它的值在編譯時是不知道的)。 – 2009-11-21 13:56:13

2

它可能可以使用Boost metaprogramming library完成。但是,如果你以前沒有使用過它或者被用來做過多的模板編程,它可能不值得需要學習如何去做的工作量。

0

模板在編譯時被實例化,而不是運行時,所以你不能在一個循環中實例化它們。

+0

你可以用編譯器做循環/迭代。請參閱上面的@drhirsch答案。 – Macke 2009-11-21 13:54:48

+0

我同意drhirsch提供了一個解決方案,但它不是一個循環,而是一個遞歸,所以我的觀點是立場。我試圖強調的一點是模板在運行時沒有實例化,這在某種程度上可以解釋drhirsch的答案。 – Clifford 2009-11-22 08:48:40

2

謝謝你們。

赫希博士是最接近需要的,但最終的前任解決方案是最乾淨的。讓我重申這個問題:需要一些模板是在編譯時使用常量參數

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)); 

預處理器運行後,它會產生所有定義的三個序列的組合。