问题描述
我似乎找不到任何关于如何在 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;
解决方法
Proto map 字段的行为通常类似于 standard library maps
您的两个示例都复制了原型;所以他们不会接触原始物体。消息在堆栈上分配的消息需要通过 delete
或(更好的)std::unique_ptr
单独删除。
但是“插入”值的最正常方式就是使用 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;
}