考虑这样一个简单的 Protobuf 代码:
message MessageName
{
oneof some_options {
OptionA optionAName = 1;
OptionB optionBName = 2;
}
}
这将生成以下 C++ 代码(或类似的代码,我手动重命名了一些变量,因此它可能不是 100% 正确):
typedef struct _namespace_name_MessageName {
pb_size_t which_some_options;
union {
namespace_name_OptionA optionAName;
namespace_name_OptionB optionBName;
} some_options;
} namespace_name_MessageName;
如何在C++中读取此消息?我想说“如果是选项A,则执行此操作”和“如果是选项B,则执行此操作”。我还没能弄清楚
which_some_options
是如何工作的,我根本无法在文档中找到它。我确实读过 this 但我找不到 Protobuf 生成的代码中提到的任何方法。一个展示我应该如何完成我想要完成的事情的例子将不胜感激。
我的项目也遇到同样的问题。
我的解决方案工作正常。
我正在使用proto3。
struct OptionA
{
int x1;
int x2;
string x3;
};
struct OptionB
{
int y1;
int y2;
string y3;
};
发送方:
message MessageName
{
enum option_type {TYPE_A, TYPE_B}
oneof some_options {
OptionA optionAName = 1;
OptionB optionBName = 2;
}
}
接收方:
if MessageName.option_type == TYPE_A
OptionA *ptrA = MessageName.optionAName()
if MessageName.option_type == TYPE_B
OptionB *ptrB = MessageName.optionBName()