136 votes

Existe-t-il une macro __CLASS__ en C ++?

Existe-t-il une macro __CLASS__ en C ++ qui donne un nom de classe similaire à __FUNCTION__ macro qui donne le nom de la fonction

90voto

Andrew Prock Points 1462

Le problème avec l'aide d' typeid(*this).name() c'est qu'il n'y a pas d' this pointeur dans une méthode statique d'appel. La macro __PRETTY_FUNCTION__ des rapports d'un nom de classe dans des fonctions statiques ainsi que les appels de méthode. Toutefois, cela ne fonctionne qu'avec gcc.

Voici un exemple de l'extraction de l'information par le biais d'une macro style de l'interface.

inline std::string methodName(const std::string& prettyFunction)
{
    size_t colons = prettyFunction.find("::");
    size_t begin = prettyFunction.substr(0,colons).rfind(" ") + 1;
    size_t end = prettyFunction.rfind("(") - begin;

    return prettyFunction.substr(begin,end) + "()";
}

#define __METHOD_NAME__ methodName(__PRETTY_FUNCTION__)

La macro __METHOD_NAME__ renverra une chaîne de la forme <class>::<method>(), de découper le type de retour, les modificateurs et les arguments de ce qu' __PRETTY_FUNCTION__ vous donne.

Pour quelque chose qui extrait juste le nom de la classe, certaines précautions doivent être prises au piège de situations où il n'existe pas de classe:

inline std::string className(const std::string& prettyFunction)
{
    size_t colons = prettyFunction.find("::");
    if (colons == std::string::npos)
        return "::";
    size_t begin = prettyFunction.substr(0,colons).rfind(" ") + 1;
    size_t end = colons - begin;

    return prettyFunction.substr(begin,end);
}

#define __CLASS_NAME__ className(__PRETTY_FUNCTION__)

76voto

Aleksei Potov Points 829

La chose la plus proche est d'appeler typeid(your_class).name() - mais cela produit un nom mutilé spécifique au compilateur.

Pour l'utiliser en classe seulement typeid(*this).name()

12voto

Pas encore. (Je pense que __class__ est proposé quelque part). Vous pouvez également essayer d'extraire une partie de classe de __PRETTY_FUNCTION__ .

8voto

vaibhav Points 21

Je pense que l'utilisation de _PRETTY_FUNCTION_ est suffisante, bien qu'elle inclue également un espace de noms, c'est-à-dire, namespace :: classname :: functionname jusqu'à ce que CLASS soit disponible.

4voto

ndim Points 11557

Si votre compilateur est g++ et que vous demandez __CLASS__ parce que vous voulez obtenir le nom de la méthode actuelle, y compris la classe, __PRETTY_FUNCTION__ devrait vous aider ( selon info gcc , section 5.43 Noms de fonctions sous forme de chaînes ).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X