Est-il __CLASSE__ macro en C++?
Est-il un __CLASS__
macro en C++ qui donne le nom de la classe similaire à __FUNCTION__
macro qui donne le nom de la fonction
Vous devez vous connecter pour publier un commentaire.
Est-il un __CLASS__
macro en C++ qui donne le nom de la classe similaire à __FUNCTION__
macro qui donne le nom de la fonction
Vous devez vous connecter pour publier un commentaire.
La chose la plus proche il y est d'appeler
typeid(your_class).name()
- mais ce produit compilateur spécifique déformés nom.À utiliser à l'intérieur de la classe, juste
typeid(*this).name()
__func__
et non-standard__FUNCTION__
ne sont pas les macros. Des documents Microsoft__FUNCTION__
comme une macro, mais le cadeau qu'il n'est pas vraiment, c'est que ce n'est pas développée par le préprocesseur lorsque vous compilez avec/P
.Le problème avec l'aide de
typeid(*this).name()
est qu'il n'est pasthis
pointeur dans une méthode statique d'appel. La macro__PRETTY_FUNCTION__
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.
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__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:
#ifdef __GNU_C__
?substr(0,colons).rfind(" ")
on pourrait utiliserrfind(' ', colons)
de rechange d'une création d'une chaîne de caractères.__METHOD_NAME__
macro. Vérifier ici.Pas encore. (Je pense que
__class__
est proposé quelque part). Vous pouvez également essayer d'extraire de la classe partie de__PRETTY_FUNCTION__
.Je voudrais suggérer boost::typeindex, j'ai appris à propos de Scott Meyer "Effective C++ Moderne" Voici un exemple de base:
Exemple
Compilé avec g++ --std=c++14" ce produit est le suivant
Sortie
Je pense que l'utilisation
__PRETTY_FUNCTION__
est assez bonne même si elle comprend l'espace c'est à direnamespace::classname::functionname
jusqu'à__CLASS__
est disponible.Si votre compilateur arrive à être
g++
et que vous demandez__CLASS__
parce que vous voulez un moyen d'obtenir de l'actuel nom de la méthode, y compris la classe,__PRETTY_FUNCTION__
devrait aider (seloninfo gcc
, section 5.43 les Noms de Fonction en tant que Chaînes).Si vous parlez MS C++ (Vous devriez état, esp comme
__FUNCTION__
est un non-standard de l'extension), il y a__FUNCDNAME__
et__FUNCSIG__
symboles qui vous pu analyserVous pouvez obtenir le nom de la fonction, y compris le nom de classe.
Cela peut processus de type C funcitons.
Ma solution:
Je travaille pour Visual C++ 12.
Voici une solution basée sur le
__FUNCTION__
macro et les modèles C++:Voici un exemple de comment cela pourrait être utilisé pour un enregistreur de classe
La sortie de
Example::Run
sera ensuiteSi vous besoin de quelque chose qui va produire effectivement, le nom de la classe au moment de la compilation, vous pouvez utiliser C++11 pour ce 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 de ce genre. 😀Cela fonctionne très bien si vous êtes prêt à payer le coût d'un pointeur.
Fonctionne avec msvc et gcc trop
Méthode suivante (basée sur methodName() ci-dessus) peut également gérer les signaux d'entrée comme "int main(int argc, char** argv)":