gpt4 book ai didi

c++ - 允许类的用户 move 私有(private)成员

转载 作者:IT老高 更新时间:2023-10-28 23:21:10 26 4
gpt4 key购买 nike

假设我有这门课:

class Message
{
public:
using Payload = std::map<std::string, boost::any>;

Message(int id, Payload payload)
: id_(id),
payload_(std::move(payload))
{}

int id() const {return id_;}

const Payload& payload() const {return payload_;}

private:
int id_;
Payload payload_;
};

其中 Payload 可能很大且复制成本很高。

我想让这个 Message 类的用户有机会 move 有效负载,而不必复制它。这样做的最佳方法是什么?

我可以想到以下几种方式:

  1. 添加一个返回可变引用的 Payload&payload() 重载。然后用户可以这样做:

    Payload mine = std::move(message.payload())

  2. 不要再假装我在封装 payload_ 并让它成为公共(public)成员。

  3. 提供一个takePayload成员函数:

    Payload takePayload() {return std::move(payload_);}

  4. 提供这个备用成员函数:

    void move(Payload& dest) {dest = std::move(payload_);}

  5. (由 Tavian Barnes 提供)提供使用 ref-qualifierpayload getter 重载:

    const Payload& payload() const {return payload_;}

    有效载荷 payload() && {return std::move(payload_);}

备选方案#3 似乎是 std::future::get 中所做的。 , 过载 (1)。

任何关于最佳替代方案(或另一种解决方案)的建议都将不胜感激。


编辑:以下是我想要完成的一些背景知识。在我的实际工作中,这个 Message 类是一些通信中间件的一部分,并且包含用户可能感兴趣或可能不感兴趣的一堆其他元数据。我曾认为用户可能希望将有效负载数据 move 到他的或者她自己的数据结构,收到后丢弃原来的Message对象。

最佳答案

似乎最一致的方法是使用选项 5:

  1. 似乎不建议使用第一个和第二个选项,因为它们会暴露实现细节。
  2. 当使用 Message 右值时,例如,从函数返回时,应该直接 move 有效负载并且它使用第 5 个选项:

    Messsage some_function();
    Payload playload(some_function().payload()); // moves
  3. std::move(x) 与表达式一起使用通常表示 x 的值不依赖于前进,其内容可能已被转移。第 5 个选项与该表示法一致。

  4. 使用相同的名称并让编译器确定内容是否可以 move ,这样在通用上下文中会更容易:

    template <typename X>
    void f(X&& message_source) {
    Payload payload(message_source.get_message());
    }

    根据 get_message() 是否产生左值或右值,有效负载被适本地复制或 move 。第三种选择不会产生这种好处。

  5. 返回值可以在复制省略避免进一步潜在复制或 move 的上下文中使用获得的值:

    return std::move(message).payload(); // copy-elision enabled

    这是第四个选项所没有的。

在 Assets 负债表的不利方面,很容易错误地尝试 move 有效载荷:

return std::move(message.payload()); // whoops - this copies!

请注意,第 5 个选项的另一个重载需要以不同方式声明:

Payload        payload() &&     { return std::move(this->payload_); }
Payload const& payload() const& { return this->payload_; }
// this is needed --^

关于c++ - 允许类的用户 move 私有(private)成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29572476/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com