Получить значения enum с помощью рефлексии google protobuf - PullRequest
1 голос
/ 13 июня 2019

Поддержка У меня есть enum в файле .proto, например:

enum My_Types
{
  my_types_a = 0;

  my_types_b = 1;

  my_types_c = 2;

}

Я хочу сгенерировать EnumDescriptor, чтобы я мог ссылаться на значения из этого перечисления, но я должен использовать Google Reflection API . При использовании скомпилированной с протоколом protobuf версии файла .proto я мог бы сказать My_Types_descriptor(), чтобы получить EnumDescriptor, но как бы я сделал это, используя отражение? То же самое относится к EnumValueDescriptor, который может описывать конкретную константу перечисления.

Учитывая DescriptorPool , как я могу использовать отражение для достижения этой цели? Я считаю, этот API мог бы помочь, но я не знаю, как его использовать.

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

Я искал следующее:

const EnumDescriptor* enum_desc = Pool->FindEnumTypeByName(custom_type);

Где Pool - это google::protobuf::DescripterPool, представляющий определения или все типы сообщений и перечисления, описанные вашими протофилами.Если у вас есть EnumDescriptor, вы можете использовать свой экземпляр отражения, чтобы сказать reflection->Getint32() (или любой другой тип, который вы ожидаете) и сказать

const EnumValueDescriptor* enum_value_desc = enum_desc->FindValueByNumber(value);

Это даст вам значение вашего перечисления.

0 голосов
/ 13 июня 2019

Вы хотите сказать, что хотите иметь возможность делать то, что делает EnumDescriptor , без генерации "кода / данных отражения" во время компиляции? Я не думаю, что есть способ сделать это. Это немного сбивает с толку то, что вы подразумеваете под , должно использовать Reflection . Действительно, EnumDescriptor использует версию отражения C ++.

Отражение по умолчанию недоступно в c ++. Поэтому, если вы хотите, вы должны написать свой синтаксический анализатор владельца (например, protobuf) или написать некоторый магический код макроса / шаблона (например, SO answer ), чтобы сгенерировать необходимые данные для отражения. Вы просто не можете использовать рефлексию, вам нужны метаданные о классе / перечислениях.

Возможно, я мог бы добавить больше, если вы уточните, что вам нужно делать и почему?

...