如何使用预处理器条件编译模板功能?就像那样(但它不起作用):
template <bool var>
void f()
{
#if (var == true)
// ...
#endif
}
答案 0 :(得分:9)
你不能。正如此名称所示,预处理器在编译器之前处理源文件。因此,它不知道模板参数的值。
答案 1 :(得分: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
成为一个类并将共享数据存储在其中。
答案 2 :(得分:3)
如果需要使用模板参数生成不同的代码路径,只需使用if
或其他C ++语句:
template <bool var>
void f()
{
if (var == true) {
// ...
}
}
编译器可以优化它并生成不包含此类分支的代码。
有一点缺点是某些编译器(例如Msvc)会为始终不变的条件生成警告。
答案 3 :(得分:0)
随着C ++ 17对if constexpr
的引入,您可以丢弃模板内的分支,就像条件编译允许的那样。
template <bool var>
void f()
{
if constexpr (var == true) {
// ...
}
}
分支内的代码必须在语法上正确无误,但在var
为假时不必格式正确,因为它将被完全丢弃。