c++ - 有条件地传递修改后的拷贝而不是 const original 变得丑陋

标签 c++

我的代码中有如下情况:

#include <memory>

struct X
{
    int i;
};


std::shared_ptr<const X> getProtoX();

void modifyX(X&);

void consumeX(const X&);


void suboptimal(bool condition)
{
    std::shared_ptr<const X> x = getProtoX();

    X copy(*x);
    if (condition)
        modifyX(copy);

    consumeX(copy);
}

请注意 getProtoX()返回一个指向常量的指针!

我们得到一个 const来自某处的对象,并希望不加修改地传递它或传递修改后的拷贝。 consumeX不关心它收到的是原始拷贝还是修改后的拷贝,只关心包含的值是它应该的值。上面的代码总是复制一个 X , 即使condition是假的,不需要复制。

我想在 condition == false 时避免这种不必要的复制,但我能想到的任何方法都不能取悦我:https://godbolt.org/z/YGLVxT

看看,如果getProtoX()返回了 std::shared_ptr<X> ,任务会很简单:

std::shared_ptr<X> x = getProtoX();

if (condition)
{
    x = std::make_shared<X>(*x);
    modifyX(*x);
}

consumeX(*x);

这是我想在代码中表达的控制流。但是一旦我们添加了常量正确性,我们就会产生开销或者由于混合的原因而不得不完全模糊意图const 、范围和生命周期管理约束。

我觉得应该有一种干净的方法可以在 const-correct 的情况下执行此操作,而无需像立即调用 lambdas 这样的语法杂技或将操作移动到一个单独的函数中,但我找不到它。请注意,应该只有一个 consumeX调用并且它应该停留在函数范围内(在示例代码中对此进行编码会造成一些困惑并提示更多解决方法,这不是我在这里关心的)。

最佳答案

std::shared_ptr<const X> x = getProtoX();

if (condition)
{
    std::shared_ptr<X> y = std::make_shared<X>(*x);
    modifyX(*y);
    x = std::move(y);
}

consumeX(*x);

关于c++ - 有条件地传递修改后的拷贝而不是 const original 变得丑陋,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57275913/

相关文章:

c++ - boost::function 的默认构造函数是否有不抛出保证?

c++ - 标准中哪里说 U::j 的默认成员初始值设定项应该被编译器忽略?

c++ - snprintf 的交叉编译版本在字符串缓冲区中分配适量的内存

c++ - 在 C++ 类中定义私有(private)变量/属性

C++,同时读取和写入二进制文件

c++ - 避免内存泄漏

c++ - 如何将枚举本身作为数组

C++:线程间共享的静态函数成员,可以全部阻塞吗?

c++ - 同时使用 std::regex,定义的行为?

USB 上的 C++ IDE?