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

时间:2018-06-24 15:20:12

标签: c++ templates

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

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

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)

这不是真正可以接受的。该如何解决?

1 个答案:

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