6

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

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

4 回答 4

9

你不能。顾名思义,预处理器在编译器之前处理源文件。因此,它不知道您的模板参数的值。

于 2012-11-14T11:35:49.010 回答
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()and之间共享信息only_if_true()(这很可能),您必须将其作为参数传递。或者创建only_if_true一个类并将共享数据存储在其中。

于 2012-11-14T12:05:12.830 回答
3

如果您需要使用模板参数生成不同的代码路径,您可以简单地使用if或其他 C++ 语句:

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

编译器可以对其进行优化并生成不包含此类分支的代码。

一个小缺点是某些编译器(例如Msvc)会为始终不变的条件生成警告。

于 2012-11-14T12:04:31.437 回答
1

随着 C++17 的引入,if constexpr您可以丢弃模板内的分支,就像条件编译允许的那样。

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

分支内的代码必须在语法上正确,但在为 false 时不必格式正确var,因为它将被完全丢弃。

于 2019-08-25T07:03:08.823 回答