请考虑代码中存在函数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)
答案 0 :(得分:1)
但是,当template参数是bool或尤其是enum类时,则没有理由不应该编译该参数。
当参数是值很少的bool
或enum
时,没有什么禁止您选择if
或switch
的大小写
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
}
}