Как получить 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;