【发布时间】:2021-07-24 04:15:11
【问题描述】:
这是我的情况:
我有这样的课:
class JSON {
private:
std::vector<JSON> children;
...
public:
JSON& operator[](std::string propertyName);
...
}
如何应用移动语义?如果使用它们有什么不同吗?
我觉得如果我这样做了
std::swap(json["hello"], json["world"])
2 个 JSON& 对象的交换将与深拷贝一样无效,因为 JSON 类中不涉及指针。
据我了解,如果我想有效地使用 Move Semantics,我需要一个指向我的子向量的指针到 std::move 该指针毫不费力,我是否正确地说如果我的类没有指针, 对 std::swap 没用?
std::swap 在我的情况下会这样做吗?
temp = json1.children; // by value? deep copy of std::vector?
json1.children = json2.children; // by value? deep copy of std::vector?
json2.children = temp; // by value? deep copy of std::vector?
这里有一点上下文:
我通过套接字接收文本,将文本转换为 JSON,我使用 json["type"] 获取消息类型,然后我的目标是向订阅该消息类型的订阅者发送包含 json["data"] 的 std::shared_ptr<const JSON>。所以我这样做了:
JSON* dummy = new JSON();
std::swap(*dummy, json["data"]);
std::shared_ptr<const JSON> dataPtr(dummy);
如果我不这样做而只做std::shared_ptr<const JSON>(&json["data"]),那么超出范围的共享指针和JSON 都会尝试释放json["data"](程序失败)。如果您使用std::make_shared<JSON>(json["data"]),您将使用 JSON& 调用复制构造函数,从而进行深层复制。
我希望我的意图很明确,我只是想避免深度复制JSON 或std::vector<JSON>
【问题讨论】:
-
std::vector已经具有移动语义。它内部一般只需要swap3 个指针或一个指针和2 个整数。您不需要自己实现移动语义。编译器生成的移动构造函数和赋值运算符在这种情况下可以正常工作。 -
一种方法是将 JSON 分配和存储与 JSON 对象分离。
Document结构可以存储所有对象并存储有关文档结构的信息(可以是完全扁平的)并使用JSON作为文档的用户友好视图。