【问题标题】:How to get protobuf enum as string?如何将protobuf枚举作为字符串?
【发布时间】:2015-08-22 22:30:54
【问题描述】:

是否有可能在 C++ 中获得与 protobuf 枚举等效的字符串?

例如:

以下是消息说明:

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);

【问题讨论】:

    标签: c++ enums protocol-buffers


    【解决方案1】:

    EnumDescriptorEnumValueDescriptor 类可用于此类操作,并且 生成的 .pb.h.pb.cc 名称很容易阅读,因此您可以查看它们以获取有关它们提供的功能的详细信息。

    在这种特殊情况下,以下应该有效(未经测试):

    std::string requestTypeString = MyMessage_RequestType_Name(requestType);
    

    【讨论】:

      【解决方案2】:

      查看Josh Kelley的答案,使用EnumDescriptorEnumValueDescriptor

      EnumDescriptor 文档说:

      • 获取 EnumDescriptor

        要获取生成的枚举类型的 EnumDescriptor,请调用 类型名称_描述符()。使用 DescriptorPool 构建自己的 描述符。

      • 要获取字符串值,请使用 FindValueByNumber(int number)

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

        按数字查找值。

        如果不存在这样的值,则返回 NULL。如果多个值都有这个 >number,则返回第一个定义的值。

      例如,获取 protobuf 枚举:

      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;
      

      【讨论】:

      • 观看这些示例末尾的-&gt;name()-&gt;number()。它们很容易被忽略,而且很难弄清楚如何纠正它们。
      猜你喜欢
      • 2019-10-03
      • 2015-12-19
      • 1970-01-01
      • 2017-03-22
      • 2016-07-30
      • 1970-01-01
      • 2019-10-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多