C++ proto2 嵌套消息具有字段检查

C++ proto2 nested message has field checks

在 C++ proto2 中,是否需要在尝试访问嵌套的 proto 消息字段之前进行 has_ 检查?

message Foo {
  optional Bar1 bar_one = 1;
}

message Bar1 {
  optional Bar2 bar_two = 2;
}

message Bar2 {
  optional int value = 3;
}
Foo foo;
if (!foo.has_bar_one() || !foo.bar_one().has_bar_two() || !foo.bar_one().bar_two().has_value()) {
  // No value
}

或者直接做就好了:

if (!foo.bar_one().bar_two().has_value()) {
  // No value
}

检查生成的代码后,您的第二种方法似乎就可以了。 bar_one 的生成代码是:

inline const ::Bar1& Foo::_internal_bar_one() const {
  const ::Bar1* p = bar_one_;
  return p != nullptr ? *p : reinterpret_cast<const ::Bar1&>(
      ::_Bar1_default_instance_);
}
inline const ::Bar1& Foo::bar_one() const {
  // @@protoc_insertion_point(field_get:Foo.bar_one)
  return _internal_bar_one();
}

基本上这是在做什么,如果设置了对象,它将提供对象,如果没有设置,它将提供默认实例。这将对 bar_twovalue.

执行相同的操作

所以最后如果勾选has_value,如果是true,说明上面的对象都设置好了,如果是false,至少value没有设置。因此,如果您只关心 value,您的第二次检查就可以了。

希望这很清楚,让我知道如何进一步提供帮助。