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_two
和 value
.
执行相同的操作
所以最后如果勾选has_value
,如果是true,说明上面的对象都设置好了,如果是false,至少value
没有设置。因此,如果您只关心 value
,您的第二次检查就可以了。
希望这很清楚,让我知道如何进一步提供帮助。
在 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_two
和 value
.
所以最后如果勾选has_value
,如果是true,说明上面的对象都设置好了,如果是false,至少value
没有设置。因此,如果您只关心 value
,您的第二次检查就可以了。
希望这很清楚,让我知道如何进一步提供帮助。