Est-il possible d'obtenir l'équivalent chaîne d'énumérations protobuf en C++?
par exemple.:
Voici la description du message:
package MyPackage;
message MyMessage
{
enum RequestType
{
Login = 0;
Logout = 1;
}
optional RequestType requestType = 1;
}
Dans mon code, je souhaite faire quelque chose comme ceci:
MyMessage::RequestType requestType = MyMessage::RequestType::Login;
// requestTypeString will be "Login"
std::string requestTypeString = ProtobufEnumToString(requestType);
Les classes EnumDescriptor et EnumValueDescriptor peuvent être utilisées pour ce type de manipulation, et les noms .pb.h
Et .pb.cc
Générés sont assez faciles à lire, afin que vous puissiez les parcourir pour obtenir des détails sur les fonctions qu'ils offrent.
Dans ce cas particulier, les éléments suivants devraient fonctionner (non testés):
std::string requestTypeString = MyMessage_RequestType_Name(requestType);
Voir la réponse de Josh Kelley , utilisez EnumDescriptor et EnumValueDescriptor .
La documentation EnumDescriptor indique:
Pour obtenir un EnumDescriptor
Pour obtenir l'EnumDescriptor pour un type d'énumération généré, appelez TypeName_descriptor (). Utilisez DescriptorPool pour construire vos propres descripteurs.
Pour obtenir la valeur de chaîne, utilisez FindValueByNumber (int number)
const EnumValueDescriptor * EnumDescriptor :: FindValueByNumber (int number) const
Recherche une valeur par nombre.
Renvoie NULL si une telle valeur n'existe pas. Si plusieurs valeurs ont ce> nombre, la première définie est renvoyée.
Exemple, obtenez l'énumération protobuf:
enum UserStatus {
AWAY = 0;
ONLINE = 1;
OFFLINE = 2;
}
Le code pour lire le nom de chaîne d'une valeur et la valeur d'un nom de chaîne:
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;