如何編譯具有預處理器條件的模板函數?像那樣(但它不工作):預處理器和模板參數或條件編譯的代碼段
template <bool var>
void f()
{
#if (var == true)
// ...
#endif
}
如何編譯具有預處理器條件的模板函數?像那樣(但它不工作):預處理器和模板參數或條件編譯的代碼段
template <bool var>
void f()
{
#if (var == true)
// ...
#endif
}
你不能。預處理器(正如該名稱所示)在編譯器之前處理源文件。因此它不瞭解你的模板參數的值。
如果你需要生成模板參數不同的代碼路徑,你可以簡單地使用if
或其他C++聲明:
template <bool var>
void f()
{
if (var == true) {
// ...
}
}
編譯器可以優化它,生成代碼不包含這樣的分支。
有一點缺點是某些編譯器(例如Msvc)會針對始終保持不變的條件生成警告。
你不能用預處理器做到這一點。所有你能做的是代碼委託給一個獨立的模板,這樣的事情:
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
成爲一個類並將共享數據存儲在其中。
不幸的是,這隻適用於兩個分支語法和語義有效的情況。 – Angew
但是,當代碼路徑取決於'f()'中的局部變量時,這種方式非常有用。在這種情況下使用模板專業化會很麻煩。 –
@MiloYip,你的回答是正確的,但是當我在調試模式下啓動程序時,所有優化(內聯函數除外)都不起作用。 – 4Bytes