支持我在.proto
文件中有一个枚举,例如:
enum My_Types
{
my_types_a = 0;
my_types_b = 1;
my_types_c = 2;
}
我想生成一个EnumDescriptor
以便可以从该枚举中引用值,但是我必须使用Google Reflection APIs。使用.proto文件的protobuf编译版本时,我可以说My_Types_descriptor()
来获得EnumDescriptor
,但是我该如何使用反射来做到这一点?可以描述特定枚举常量的EnumValueDescriptor
也是如此。
给出一个DescriptorPool,我该如何使用反射来实现这一目标?我相信this API可以帮助您,但我不知道如何使用它。
答案 0 :(得分:0)
您是否意味着要能够执行EnumDescriptor的操作,而不必在编译时生成“反射代码/数据”来执行此操作?我认为没有办法做到这一点。 必须使用反射,这让您感到困惑。确实,EnumDescriptor使用的是C ++版本的反射。
默认情况下,反射在c ++中不可用。因此,如果需要,您必须编写所有者解析器(例如protobuf)或编写一些神奇的宏/模板代码(例如SO answer)来生成反射所需的数据。您不能使用反射,而需要有关类/枚举的元数据。
如果您阐明您需要做什么以及为什么这样做,也许我可以添加更多内容?
答案 1 :(得分:0)
我要寻找的是这个
const EnumDescriptor* enum_desc = Pool->FindEnumTypeByName(custom_type);
Pool
是google::protobuf::DescripterPool
的地方,代表原型文件描述的定义或所有消息类型和枚举。拥有EnumDescriptor
之后,您就可以使用反射实例说出reflection->Getint32()
(或您期望的其他任何类型)并说出
const EnumValueDescriptor* enum_value_desc = enum_desc->FindValueByNumber(value);
这给您枚举的价值。