C++对现有变量或新变量的条件引用
C++ conditional reference to existing or new variable
我有一个函数,它通过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()
或将其移动到另一个包装器函数中更简单(在最小示例中很难传达复杂的代码(。
相关文章:
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 多个"常量引用"变量可以共享同一个内存吗?
- 如果非动态变量被指针引用,何时超出范围?
- 在 c++ 中将变量作为结构构造函数中的引用传递
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- 为什么C++可以使用未初始化的成员变量(引用或指针 *NOT 值复制*)来初始化其父类的成员变量
- 地址运算符是否返回变量引用的对象的地址
- 未在另一个函数中设置变量引用的问题
- 英特尔样式内联程序集和 AT&T 样式中的变量引用,C++
- 将成员变量引用为类成员
- 从静态变量引用非静态变量会使非静态变量先于静态变量进行析构函数
- 何时解析 C++11 lambda 表达式中的变量引用
- 堆栈/堆变量的变量/引用名称或类型存储在内存中的位置
- C++强制对变量引用进行编译优化,使之成为直接的
- Boost变量引用和相等比较
- 使复制的成员引用变量引用副本的成员,而不是原始成员的成员
- 为什么要在Java中生成变量引用数组
- 捕获和调试对移动lambda内部局部变量引用的无效使用
- 在变量初始化后更改变量引用
- 从'C'程序中提取变量定义和变量引用