繁体   English   中英

在 C++ 中使用 protobuf 对象的 protobuf 映射

[英]Using a protobuf map of protobuf objects in C++

我似乎找不到任何关于如何在 C++ 中操作使用非标量值的 protobuf 映射的明确提及。 例如考虑这个 proto 文件:

syntax = "proto3"
message X{
  uint32 name = 1;
}

message Y{
  map<string, X> values = 1;
}

请注意,X 是非标量。 我将如何在 C++ 中将某些内容插入到这张地图中? 我需要动态分配一个 X 对象还是没有必要? 例如,下面的两段代码都正确吗? 对于动态分配的,我是否需要在插入映射后显式释放指针? 如果是,在复制地图中的数据后释放指针的正确方法是什么?

代码1:

Y y;
X * x = new X();
x->set_name(123);
auto map = y.mutable_values();
(*map)["key value"] = *x;

代码2:

Y y;
X x;
x.set_name(123);
auto map = y.mutable_values();
(*map)["key value"] = x;

原型地图字段的行为通常类似于标准库地图

您的两个示例都制作了原型的副本; 所以他们不会接触原始物体。 需要通过delete或(更好) std::unique_ptr单独delete消息在堆栈上分配的消息。

但是“插入”值的最正常方法就是使用operator[] 就像在标准库映射中一样,如果该值尚不存在,这将创建该值的默认实例:

Y y;
X& x = (*y->mutable_values())["key"];
x.set_name(123);

如果您已经有要插入的X实例,最简单的方法是使用std::move

Y WrapValue(X value) {
  Y y;
  (*y.mutable_values())["key"] = std::move(value);
  return y;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM