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

标签 c++ c++11 protocol-buffers

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

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

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

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

代码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;

最佳答案

原始 map 字段的行为通常类似于 standard library maps

您的两个示例都会复制原型(prototype);所以他们不会接触原来的物体。在堆栈上分配消息的消息需要通过 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;
}

关于c++ - 在 C++ 中使用 protobuf 对象的 protobuf 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68416748/

相关文章:

c++ - GCC 选项 : warning on non-void functions without a return statement

c++ - C++11 程序可以使用 BlueZ 吗?

c++ - BOOST_PP_ITERATE() 结果为 "no such file or directory"

c++ - Boost::signals2 传递无效数据

ios - Protocol buffer 代码针对 iOS 模拟器进行编译,但不适用于设备

c++ - 添加到 Protocol Buffers 重复字段

C++ BST树插入一个字符串

c++ - 将 "auto"关键字用于带有 GCC 的 std::list 迭代器

c++ - 为什么不允许使用 `std::uniform_int_distribution<uint8_t>` 和 `std::uniform_int_distribution<int8_t>`?

java - 在分析器中创建哪种格式的日志?