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

时间:2019-04-16 09:38:49

标签: c++ reference

我有一个函数可以通过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);
}

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

2 个答案:

答案 0 :(得分:3)

“天真的”解决方案就像

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

没有进行额外的复制。

答案 1 :(得分:0)

另一种选择是

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()或将其移至另一个包装函数要简单(在最小的示例中很难传递复杂的代码)。