Как получить protobuf enum как строку?

Можно ли получить эквивалент строки protobuf enums в С++?

например:.

Ниже приведено описание сообщения:

package MyPackage;

message MyMessage
{
    enum RequestType
    {
        Login = 0;
        Logout = 1;
    }

    optional RequestType requestType = 1;
}

В моем коде я хочу сделать что-то вроде этого:

MyMessage::RequestType requestType = MyMessage::RequestType::Login;

// requestTypeString will be "Login"
std::string requestTypeString = ProtobufEnumToString(requestType);

Ответ 1

EnumDescriptor и EnumValueDescriptor классы могут использоваться для такого рода манипулирования, а сгенерированные имена .pb.h и .pb.cc достаточно просты для чтения, поэтому вы можете просмотреть их, чтобы получить подробную информацию о функциях, которые они предлагают.

В этом конкретном случае нижеследующее должно работать (непроверено):

std::string requestTypeString = MyMessage_RequestType_Name(requestType);

Ответ 2

См. ответ Джош Келли, используйте EnumDescriptor и EnumValueDescriptor.

Документация EnumDescriptor гласит:

  • Чтобы получить EnumDescriptor

    Чтобы получить EnumDescriptor для сгенерированного типа перечисления, вызовите TypeName_descriptor(). Используйте DescriptorPool для создания собственного дескрипторы.

  • Чтобы получить строковое значение, используйте FindValueByNumber (int number)

    const EnumValueDescriptor * EnumDescriptor:: FindValueByNumber (int number) const

    Выбирает значение по номеру.

    Возвращает NULL, если такое значение не существует. Если несколько значений имеют этот > номер, возвращается первый из них.

Пример: введите protobuf enum:

enum UserStatus {
  AWAY = 0;
  ONLINE = 1;
  OFFLINE = 2;
}

Код для чтения имени строки из значения и значения из имени строки:

const google::protobuf::EnumDescriptor *descriptor = UserStatus_descriptor();

std::string name = descriptor->FindValueByNumber(UserStatus::ONLINE)->name();
int number = descriptor->FindValueByName("ONLINE")->number();

std::cout << "Enum name: " << name << std::endl;
std::cout << "Enum number: " << number << std::endl;