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