Ale*_*iea 24 c++ enums protocol-buffers
是否有可能在C++中获得相当于protobuf枚举的字符串?
例如:
以下是消息说明:
package MyPackage;
message MyMessage
{
enum RequestType
{
Login = 0;
Logout = 1;
}
optional RequestType requestType = 1;
}
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我希望做这样的事情:
MyMessage::RequestType requestType = MyMessage::RequestType::Login;
// requestTypeString will be "Login"
std::string requestTypeString = ProtobufEnumToString(requestType);
Run Code Online (Sandbox Code Playgroud)
Jos*_*ley 23
该EnumDescriptor和EnumValueDescriptor类可用于这种操纵的,而所产生的.pb.h和.pb.cc名称是很容易阅读,因此,您可以查看通过他们得到他们所提供的功能的详细信息.
在这种特殊情况下,以下内容应该有效(未经测试):
std::string requestTypeString = MyMessage_RequestType_Name(requestType);
Run Code Online (Sandbox Code Playgroud)
请参阅Josh Kelley的答案,使用EnumDescriptor和EnumValueDescriptor.
EnumDescriptor文档说:
获得EnumDescriptor
要获取生成的枚举类型的EnumDescriptor,请调用TypeName_descriptor().使用DescriptorPool构建自己的描述符.
要获取字符串值,请使用FindValueByNumber(int number)
const EnumValueDescriptor*EnumDescriptor :: FindValueByNumber(int number)const
按编号查找值.
如果不存在此值,则返回NULL.如果多个值具有此>数字,则返回定义的第一个值.
例如,获取protobuf枚举:
enum UserStatus {
AWAY = 0;
ONLINE = 1;
OFFLINE = 2;
}
Run Code Online (Sandbox Code Playgroud)
从值中读取字符串名称的代码和从字符串名称中读取的值:
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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25186 次 |
| 最近记录: |