预处理程序和模板参数或代码段的条件编译

时间:2012-11-14 11:32:54

标签: c++ templates c-preprocessor

如何使用预处理器条件编译模板功能?就像那样(但它不起作用):

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

4 个答案:

答案 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为假时不必格式正确,因为它将被完全丢弃。