我有一个带有“可选”参数的函数,可用于收集中间输出。
例如,假设在对数组求和时我正在收集部分和:
template<bool writeout> double sumNumbers(const std::vector<double> &numbers, double *out_partialsums) {
double total = 0.0;
for (int i = 0; i < numbers.size(); i++) {
total += numbers[i];
/* ... */
if (writeout) {
out_partialsums[i] = total;
}
}
return total;
}
({double *
用于此处争论)
但是我希望在完全禁用'writeout'参数的情况下可以调用它,即:
如果将writeout设置为false,我希望编译器删除“ writeout”分支,因此我们不对其进行检查,而是对内部循环的每次迭代进行分支。
我想避免重复任何实现(让我们想象实际功能要比这个复杂得多)
我希望能够在我的代码的其他地方使用该函数的两个版本(不能通过#DEFINE之类的操作来完成)。
如果使用上面的示例,则仍需要在呼叫站点提供“虚拟”指针,例如:
auto result = sumNumbers<false>(numbers, NULL)
这不是真正可以接受的。该如何解决?
答案 0 :(得分:1)
您可以为模板参数和功能参数使用默认参数值,如下所示:
template<bool writeout = false>
double sumNumbers(const std::vector<double> &numbers, double *out_partialsums = NULL) {
...
}
,该呼叫将与子和:
auto result = sumNumbers<true>(numbers, subsum);
或没有它:
auto result = sumNumbers(numbers);