web-dev-qa-db-fra.com

Comment obtenir l'énumération protobuf en tant que chaîne?

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);
24
Alexandru Irimiea

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);
23
Josh Kelley

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;
8
rmldts