Existe-t-il une __CLASS__
macro en C ++ qui donne le nom de la classe similaire à la __FUNCTION__
macro qui donne le nom de la fonction
100
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 dans la classe juste typeid(*this).name()
__func__
et non standard__FUNCTION__
ne sont pas des macros. Microsoft documente__FUNCTION__
sous forme de macro, mais ce n'est pas vraiment le cas, c'est qu'il n'est pas étendu par le préprocesseur lorsque vous compilez avec/P
.Le problème avec l'utilisation
typeid(*this).name()
est qu'il n'y a pas dethis
pointeur dans un appel de méthode statique. La macro__PRETTY_FUNCTION__
signale un nom de classe dans les fonctions statiques ainsi que les appels de méthode. Cependant, cela ne fonctionnera qu'avec gcc.Voici un exemple d'extraction des informations via une interface de style macro.
La macro
__METHOD_NAME__
renverra une chaîne du formulaire<class>::<method>()
, découpant le type de retour, les modificateurs et les arguments de ce__PRETTY_FUNCTION__
qui vous donne.Pour quelque chose qui extrait uniquement le nom de la classe, il faut prendre soin de capturer les situations où il n'y a pas de classe:
la source
#ifdef __GNU_C__
?substr(0,colons).rfind(" ")
un pourrait utiliserrfind(' ', colons)
pour épargner la création d'une chaîne supplémentaire.__METHOD_NAME__
macro. Vérifiez ici .constexpr
fonction pour l'évaluer au moment de la compilationJe voudrais suggérer boost :: typeindex , que j'ai appris de Scott Meyer "Effective Modern C ++" Voici un exemple de base:
Exemple
Compilé avec "g ++ --std = c ++ 14" cela produit ce qui suit
Production
la source
Pas encore. (Je pense que
__class__
c'est proposé quelque part). Vous pouvez également essayer d'extraire une partie de classe à partir de__PRETTY_FUNCTION__
.la source
Je pense que l'utilisation
__PRETTY_FUNCTION__
est assez bonne même si elle inclut également un espace de noms, c'est-namespace::classname::functionname
à- dire jusqu'à ce qu'il__CLASS__
soit disponible.la source
Si votre compilateur se trouve être
g++
et que vous le demandez__CLASS__
parce que vous voulez un moyen d'obtenir le nom de la méthode actuelle, y compris la classe, cela__PRETTY_FUNCTION__
devrait aider (conformément à lainfo gcc
section 5.43 Noms de fonctions sous forme de chaînes ).la source
Si vous avez besoin de quelque chose qui produira réellement le nom de la classe au moment de la compilation, vous pouvez utiliser C ++ 11 pour le faire:
Je reconnais que ce n'est pas la même chose que
__FUNCTION__
mais j'ai trouvé ce post en cherchant une réponse comme celle-ci. :RÉla source
Si vous parlez MS C ++ (Vous devez indiquer, surtout comme
__FUNCTION__
une extension non standard), il y a__FUNCDNAME__
et__FUNCSIG__
symboles que vous pouvez parserla source
Vous pouvez obtenir le nom de la fonction, y compris le nom de la classe. Cela peut traiter des fonctions de type C.
la source
Ma solution:
Je travaille pour Visual C ++ 12.
la source
Voici une solution basée sur les
__FUNCTION__
modèles de macro et C ++:Voici un exemple de la façon dont cela pourrait être utilisé pour une classe de journalisation
La sortie de
Example::Run
sera alorsla source
Cela fonctionne très bien si vous êtes prêt à payer le coût d'un pointeur.
la source
Fonctionne aussi avec msvc et gcc
la source
Toutes les solutions publiées ci-dessus qui reposent sur le
__PRETTY_FUNCTION__
ont un ou des cas de bord spécifiques où ils ne renvoient pas uniquement le nom de la classe / nom de la classe. Par exemple, considérez la jolie valeur de fonction suivante:L'utilisation de la dernière occurrence de
"::"
comme délimiteur ne fonctionnera pas car le paramètre de fonction contient également un"::"
(std::string
). Vous pouvez trouver des cas de bord similaires pour"("
comme délimiteur et plus encore. La seule solution que j'ai trouvée prend les macros__FUNCTION__
et__PRETTY_FUNCTION__
comme paramètres. Voici le code complet:la source
La méthode suivante (basée sur methodName () ci-dessus) peut également gérer une entrée comme "int main (int argc, char ** argv)":
la source