如何在 proto3 中使用其名称获取字段对象

How to get a field object using its name in proto3

我正在将模式从 proto2 语法迁移到 proto3 语法。我想消除扩展,因为它们不受支持。是否可以在 proto3 中使用字段名获取对象,类似于 MutableExtension 在 proto2 中所做的。

例如,

proto2 语法中的架构

message Foo {
  message Bar {
    unint32 a = 1;
  }
  extend Foo {
    Bar b = 1;
  }
}

C++

Foo::Bar b_val = foo.MutableExtension(Foo::b);

现在在 proto3 中,我可以这样做:

syntax="proto3";
message Foo {
  message Bar {
    unint32 a = 1;
  }
  Bar b = 1;
}

C++ 代码:

Foo::Bar b_val = foo.mutable_b();

不过,我想用名字Foo::b得到一个Foo::Bar对象。有办法吗?

不清楚你为什么需要这个,但你要求的是 有点 可行。

Foo::b 是一个普通的成员函数,这意味着 &Foo::b 是一个常规的指向成员函数的指针。

因此您可以使用这些实体的常规 c++ 语法来使用它:

auto b_ref = &Foo::b;

Foo::Bar b_val = (foo.*b_ref)();