那样:
template <bool Mode>
void doIt()
{
//many lines
template_if(Mode)
{
doSomething(); // and not waste resources on if
}
//many other lines
}
我知道有enable_if命令可用于有条件地启用该功能,但我不认为我可以在这里使用它这样的选项。 基本上我需要的是模板构造,它充当#ifdef宏。
答案 0 :(得分:3)
在尝试复杂的事情之前,经常值得检查一下这个简单的解决方案是否已达到你想要的效果。
我能想到的最简单的事情就是使用if
:
#include <iostream>
void doSomething()
{
std::cout << "doing it!" << std::endl;
}
template <bool Mode>
void doIt()
{
//many lines
if(Mode)
{
doSomething(); // and not waste resources on if
}
//many other lines
}
void dont()
{
doIt<false>();
}
void actuallyDoIt()
{
doIt<true>();
}
那是什么呢?
gcc 5.3 with no optimizations已启用:
void doIt<false>():
pushq %rbp
movq %rsp, %rbp
nop
popq %rbp
ret
void doIt<true>():
pushq %rbp
movq %rsp, %rbp
call doSomething()
nop
popq %rbp
ret
请注意doSomething()
案例中false
只调用doIt
函数调用的if
调用。转向优化甚至可以消除这种情况。
所以我们已经得到了我们想要的东西而不是在<?php
中浪费任何东西。将它留在那可能是好的,而不是添加任何不必要的复杂性。
答案 1 :(得分:1)
可以排序。
如果您的&#34;中的代码如果&#34;在语法和语义上对于您打算提供的完整模板参数集是有效的,那么您基本上只需编写if
语句。由于基本的优化,当if (someConstant) { .. }
为someConstant
时,false
无法在编译中继续存在。那是那个。
但是,如果条件代码在条件未满足时实际上无效,则您无法执行此操作。这是因为类模板和函数模板被实例化了...... 完整。您的整个函数体都被实例化,因此它必须是有效的。没有实例化任意代码块的事情。†
因此,在这种情况下,您必须使用enable_if
或其他任何内容回到凌乱的旧功能专业化。
† C ++ 17很可能有if constexpr
,基本上就是这个。但那是未来的谈话。
答案 2 :(得分:0)
您可以专门化模板,以便仅在模板参数为true
时使用您的代码:
template < typename _Cond > struct condition {};
template <> struct condition<false> {
static /* constexpr */ void do_something() {};
}
template <> struct condition<true> {
static void do_something() {
// Actual code
}
}
// Usage:
condition<true>::do_something();
condition<compiletime_constant>::do_something();