c++ 函数的可选写出参数

Optional write-out parameter for c++ function

本文关键字:参数 函数 c++      更新时间:2023-10-16

我有一个带有"可选"参数的函数,可用于收集中间输出。

例如,假设我在对数组求和时正在收集部分总和,如下所示:

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"参数的情况下可调用,即:

  1. 如果 writeout 设置为 false,我希望编译器删除"writeout"分支,因此我们不会检查它并对内部循环的每次迭代进行分支。

  2. 我想避免重复任何实现(让我们想象一下实际功能比这个复杂得多(

  3. 我希望能够在代码中的其他地方使用该函数的两个版本(不能用 #DEFINE 之类的东西来做到这一点(。

如果我使用上面的例子,那么我仍然必须在调用站点上提供一个"虚拟"指针,如下所示:

auto result = sumNumbers<false>(numbers, NULL)

这是不可接受的。如何解决这个问题?

您可以对模板参数和函数参数使用默认参数值,如下所示:

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);