我有一个函数可以通过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);
}
这似乎有点令人费解。有没有更好的办法?我想避免不必要的复制。
答案 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()
或将其移至另一个包装函数要简单(在最小的示例中很难传递复杂的代码)。