C ++模板可以用于条件代码包含吗?

时间:2016-05-05 10:49:50

标签: c++ templates

那样:

template <bool Mode>
void doIt()
{
   //many lines
   template_if(Mode)
   {
      doSomething(); // and not waste resources on if
   }
   //many other lines
}

我知道有enable_if命令可用于有条件地启用该功能,但我不认为我可以在这里使用它这样的选项。 基本上我需要的是模板构造,它充当#ifdef宏。

3 个答案:

答案 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();