Скажем, у меня есть этот класс:
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
возможность переместить полезную нагрузку вместо копирования. Каким будет лучший способ сделать это?
Я могу думать о следующих путях:
-
Добавьте перегрузку
Payload& payload()
, которая возвращает изменчивую ссылку. Затем пользователи могут:Payload mine = std::move(message.payload())
-
Прекратите делать вид, что я инкапсулирую
payload_
и просто сделаю его публичным. -
Предоставить функцию члена
takePayload
:Payload takePayload() {return std::move(payload_);}
-
Предоставьте эту альтернативную функцию-член:
void move(Payload& dest) {dest = std::move(payload_);}
-
(Предоставлено Tavian Barnes) Предоставьте перегрузку
Payload
, которая использует ref-qualifier:const Payload& payload() const {return payload_;}
Payload payload() && {return std::move(payload_);}
Альтернативой № 3, по-видимому, является то, что сделано в std:: future:: get, перегрузка (1).
Было бы полезно получить любые рекомендации о том, какая была бы лучшая альтернатива (или еще одно решение).
РЕДАКТИРОВАТЬ. Вот несколько примеров того, что я пытаюсь выполнить. В моей реальной жизни этот класс Message является частью некоторого связующего ПО для связи и содержит кучу других метаданных, которые пользователь может или не может заинтересовать. Я думал, что пользователь может захотеть перенести данные полезной нагрузки в свою или ее собственные структуры данных и отбросить исходный объект сообщения после его получения.