是否有可能在C ++中获得与protobuf枚举相当的字符串?
e.g:
以下是消息说明:
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);
答案 0 :(得分:21)
EnumDescriptor和EnumValueDescriptor类可用于此类操作,以及
生成的.pb.h
和.pb.cc
名称很容易阅读,因此您可以查看它们以获取它们提供的功能的详细信息。
在这种特殊情况下,以下内容应该有效(未经测试):
std::string requestTypeString = MyMessage_RequestType_Name(requestType);
答案 1 :(得分:5)
请参阅Josh Kelley的答案,使用EnumDescriptor和EnumValueDescriptor。
EnumDescriptor文档说:
获取EnumDescriptor
要获取生成的枚举类型的EnumDescriptor,请调用 TypeName_descriptor()。使用DescriptorPool构建自己的 描述符。
要获取字符串值,请使用FindValueByNumber(int number)
const EnumValueDescriptor * EnumDescriptor :: FindValueByNumber(int number)const
按编号查找值。
如果不存在此值,则返回NULL。如果多个值具有此>数,则返回定义的第一个。
示例,获取protobuf枚举:
google.visualization.events.addListener(my_chart, 'ready', function () {
chart_div.innerHTML = '<img src="' + my_chart.getImageURI() + '">';
var html_data = document.getElementById('img_container');
console.log(html_data.innerHTML);
});
从值读取字符串名称的代码和字符串名称中的值:
enum UserStatus {
AWAY = 0;
ONLINE = 1;
OFFLINE = 2;
}