2009-03-03 26 views
8

假設我有一組函數和類,它們的模板使用單精度(float)或double精度。當然,我可以只寫兩段引導代碼,或者用宏來搞亂。但是我可以在運行時切換模板參數嗎?在C++運行時選擇模板參數

回答

19

不,您不能在運行時切換模板參數,因爲模板在編​​譯時由編譯器實例化。你可以做的是有兩個模板公共基類派生,總是使用基類中的代碼,然後決定哪些派生類在運行時使用:

class Base 
{ 
    ... 
}; 

template <typename T> 
class Foo : public Base 
{ 
    ... 
}; 

Base *newBase() 
{ 
    if(some condition) 
     return new Foo<float>(); 
    else 
     return new Foo<double>(); 
} 

宏有同樣的問題模板,因爲它們在編譯時被擴展。

3

模板是一種編譯時機制。順便說一句,宏也是一樣(嚴格來說 - 預處理機制 - 即使在編譯之前也是如此)。

2

模板純粹是一個編譯時構造,編譯器將展開一個模板並用指定的參數創建您的類/函數,並直接將其轉換爲代碼。

如果您試圖在運行時在foo<float>foo<double>之間切換,您需要使用一些元編程技巧或者爲每個元編程路徑分別設置代碼路徑。