Protobuf oneof的has_param()为私有是否正常?如何判断oneof已设置?
Protobuf C++中oneof的
has_<oneof_name>()为私有是否正常?如何判断oneof是否设置? 这种情况是完全正常的。Protobuf的C++代码生成规则里,oneof对应的统一has_<oneof_name>()方法会被设为私有——这是因为oneof本身是互斥字段组的设计,官方并不推荐用统一的has方法判断状态,而是提供了更精准的方式。
判断oneof是否已被设置的两种常用方法:
1. 使用param_case()方法
生成的代码中会为oneof生成一个ParamCase枚举类型,调用param_case()会返回对应的枚举值,直接判断是否为未设置状态即可:
Test msg; // 检查oneof是否未设置 if (msg.param_case() == Test::PARAM_NOT_SET) { // 处理未设置的逻辑 } else { // 根据具体设置的字段分支处理 switch (msg.param_case()) { case Test::TEST2: // 已设置test2,可通过msg.test2()获取值 break; case Test::TEST3: // 已设置test3,可通过msg.test3()获取值 break; default: break; } }
2. 直接判断具体字段的has_<field_name>()
虽然oneof的统一has方法是私有,但每个oneof内部字段对应的has_test2()、has_test3()都是公有的,可以直接调用判断对应字段是否被设置:
Test msg; if (msg.has_test2()) { // test2已被设置 } else if (msg.has_test3()) { // test3已被设置 } else { // oneof未设置任何字段 }
上述两种方法在你测试的3.12.4和3.21.9版本中都能正常工作,是Protobuf官方认可的判断方式。
内容的提问来源于stack exchange,提问作者vegalock
相关产品推荐
相关产品推荐

