C++对现有变量或新变量的条件引用

C++ conditional reference to existing or new variable

本文关键字:变量 引用 条件 新变量 C++      更新时间:2023-10-16

我有一个函数,它通过const引用转发一些大变量,如下所示:

void processMore(const std::vector<int> &a, const std::vector<int> &b);
void process(const std::vector<int> &a,
             const std::vector<int> &b) {
  processMore(a, b);
}

但是我添加了一个优化来修改它们:

std::pair<std::vector<int>, std::vector<int>>
optimise(const std::vector<int> &a, const std::vector<int> &b);

我可以像这样无条件地做到这一点:

void process(const std::vector<int> &a,
             const std::vector<int> &b) {
  auto opt = optimise(a, b);
  processMore(opt.first, opt.second);
}

但我想让它成为可选的。我的解决方案是这样的:

void process(const std::vector<int> &a,
             const std::vector<int> &b,
             bool doOptimisation) {
  auto opt =
      [&]() -> std::pair<const std::vector<int>&,
                         const std::vector<int>&> {
    if (doOptimisation) {
      auto o = optimise(a, b);
      return std::make_pair(o.first, o.second);
    }
    return std::make_pair(a, b);
  }();
  processMore(opt.first, opt.second);
}

这似乎有点令人费解。有没有更好的方法?我想避免不必要的复制。

"朴素"的解决方案是这样的

if (doOptimisation)
{
    auto o = optimise(a, b);
    processMore(o.first, o.second);
}
else
{
    processMore(a, b);
}

无需进行额外的复制。

另一种选择是:

void process(const std::vector<int> &a,
             const std::vector<int> &b,
             bool doOptimisation) {
  std::optional<std::pair<std::vector<int>, std::vector<int>>> opt;
  if (doOptimisation) {
    opt = optimise(a, b);
  }
  const auto &aOpt = opt ? opt->first : a;
  const auto &bOpt = opt ? opt->second : b;
  processMore(aOpt, bOpt);
}

这比在我的实际代码中重复processMore()或将其移动到另一个包装器函数中更简单(在最小示例中很难传达复杂的代码(。