[英]C++ instantiate templates in loop
我有一個工廠類,需要使用連續的模板參數來實例化幾個模板,這些參數是簡單的整數。 如何在不展開整個循環的情況下實例化這樣的模板函數?
唯一可以想到的是使用升壓預處理器。 你能推薦一些不依賴於預處理器的東西嗎?
謝謝
模板參數必須是編譯時常量。 目前,即使在展開后,編譯器也不會將循環計數器變量視為常量。 這可能是因為必須在模板即時期間知道常量,這在循環展開之前發生。
但是可以構造一個“遞歸”模板並將特化作為結束條件。 但即使這樣,循環邊界也需要編譯時間常數。
template<int i>
class loop {
loop<i-1> x;
}
template<>
class loop<1> {
}
loop<10> l;
將從循環<10>到循環<1>創建十個模板類。
它可能可以使用Boost元編程庫完成 。 但是如果您之前沒有使用它或者習慣於進行過多的模板編程,那么學習如何操作它可能不值得花費大量的工作。
感謝你們。
Hirsch博士最接近所需,但最終解決方案是最干凈的。 讓我重申一下這個問題:需要使用常量參數在編譯時實例化幾個模板
f0 = f<0,0>();
f1 = f<0,1>();
...
fk = f<m,n>();
對於任何大量的m,並且n展開模板創建使代碼繁忙。 使用boost預處理器,我已完成以下操作:
#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));
在預處理器運行之后,它會生成定義的三個序列的所有組合。
我不認為它在運行時是可能的,因為MyClass<1>
和MyClass<2>
是絕對不同的類。
但我有一個想法:如果你知道所有可能的值,你可以在工廠類中編寫一個switch
,並將這個整數作為參數傳遞給工廠。
模板在編譯時實例化,而不是在運行時實例化,因此您根本無法在循環中實例化它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.