簡體   English   中英

C ++在循環中實例化模板

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM