我该如何使用预处理器条件编译模板函数?像这样(但它并不起作用):
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()
和 only_if_true()
之间共享信息(这很可能),你需要将其作为参数传递。或者将 only_if_true
设为一个类,并将共享数据存储在其中。如果你需要使用模板参数生成不同的代码路径,你可以简单地使用 if
或其他 C++ 语句:
template <bool var>
void f()
{
if (var == true) {
// ...
}
}
if constexpr
,您可以像条件编译一样在模板内部丢弃分支。template <bool var>
void f()
{
if constexpr (var == true) {
// ...
}
}
当var
为false时,分支内的代码必须在语法上正确,但不必是格式良好的,因为它将被完全丢弃。
f()
中的局部变量时,这种方法非常有用。在这种情况下使用模板特化会很麻烦。 - Milo Yip