2012-11-14 38 views

回答

9

你不能。預處理器(正如該名稱所示)在編譯器之前處理源文件。因此它不瞭解你的模板參數的值。

3

如果你需要生成模板參數不同的代碼路徑,你可以簡單地使用if或其他C++聲明:

template <bool var> 
void f() 
{ 
    if (var == true) { 
     // ... 
    } 
} 

編譯器可以優化它,生成代碼不包含這樣的分支。

有一點缺點是某些編譯器(例如Msvc)會針對始終保持不變的條件生成警告。

+0

不幸的是,這隻適用於兩個分支語法和語義有效的情況。 – Angew

+0

但是,當代碼路徑取決於'f()'中的局部變量時,這種方式非常有用。在這種情況下使用模板專業化會很麻煩。 –

+0

@MiloYip,你的回答是正確的,但是當我在調試模式下啓動程序時,所有優化(內聯函數除外)都不起作用。 – 4Bytes

7

你不能用預處理器做到這一點。所有你能做的是代碼委託給一個獨立的模板,這樣的事情:

template <bool var> 
void only_if_true() 
{} 

template <> 
void only_if_true<true>() 
{ 
    your_special_code_here(); 
} 


template <bool var> 
void f() 
{ 
    some_code_always_used(); 
    only_if_true<var>(); 
    some_code_always_used(); 
} 

當然,如果你需要f()only_if_true()之間共享的信息(這是有可能的),你必須把它作爲參數傳遞。或者讓only_if_true成爲一個類並將共享數據存儲在其中。