放松的constexpr要求,枚举类和bool模板参数

时间:2019-06-23 21:36:04

标签: c++ templates

请考虑代码中存在函数accumulate的情况,该函数确实可以大量分配调度程序函数process。累加功能会在热循环中测试参数,因此该参数已模板化。

enum class Op {
  Multiply,
  Add
};

template<Op op>
int accumulate(const std::vector<int> &vec) {
  int a = op == Op::Multiply ? 1 : 0;
  for (int v : vec)
    if constexpr (op == Op::Add) a += v; else a *= v;
  return a;
}

int process(const std::vector<int> &vec, Op op) {
  return accumulate<op>(vec);
}

您可能已经注意到,由于从process传递的模板参数不是constexpr,因此该代码将无法编译。但是,当template参数是bool或特别是enum类时,没有理由不应该编译它。

在实践中,当执行繁重工作的函数具有多个变体时,此类代码会大量出现(我们只希望在代码库中保留一个副本)。是否有建议或讨论以使此类代码将来有效?

(C ++具有太多功能,尽管我缺少这一特别的功能:p)

1 个答案:

答案 0 :(得分:1)

  

但是,当template参数是bool或尤其是enum类时,则没有理由不应该编译该参数。

当参数是值很少的boolenum时,没有什么禁止您选择ifswitch的大小写

int process1 (const std::vector<int> &vec, bool b) {
  if ( b == true )
     return accumulate<true>(vec);
  else
     return accumulate<false>(vec);
}


int process2 (const std::vector<int> &vec, Op op) {
  switch ( op ) {
     case Op::Multiply:
        return accumulate<Op::Multiply>(vec);
        break;

     case Op::Add:
        return accumulate<Op::Add>(vec);
        break;

     // other cases

     // default
  }
} 
相关问题