Comment obtenir le nom de la classe?
Si je définis une classe:
class Blah {};
Comment puis-je:
std::string const className = /* What do I need to do here? */;
assert( className == "Blah" );
Je ne pense pas que typeid().nom() est une bonne idée car c'est compilateur de mise en œuvre spécifiques. Est-il rien de prévu par la norme C++ ou coup de pouce?
Remarque: Si la classe ont été hérités de l'intervalle Qt de QObject, je pourrais facilement utiliser QMetaObject::className()
pour obtenir le nom de la classe.
OriginalL'auteur sivabudh | 2010-12-16
Vous devez vous connecter pour publier un commentaire.
Comme ceci:
Ou ceci:
Amateur:
Ou ceci:
Ou ceci:...
Ou ceci: ...
typeid n'est pas garanti d'être unmanglable..
Le premier cas est le seul sérieux. C'est lisible, facile à entretenir et à utiliser. La deuxième overcomplicates un problème simple. Peut-être que vous préférez utiliser une api REST pour appeler un service web à la place? Le troisième est considérée comme de la mauvaise habitude. Quand il s'agit de la bonne conception, le préprocesseur est la pire et la dernière chose que vous devriez utiliser. La seulement quelques raisonnable des cas d'utilisation pour les préprocesseurs, je pense, pragma fois.
OriginalL'auteur
Le test d'une classe en regardant son nom sonne terriblement comme un style Java approche de moi, et en C++, il faut se méfier d'essayer d'appliquer les mêmes modèles! Une meilleure approche serait d'utiliser quelque chose comme
boost::type_traits
, et peut-êtreis_same
, avec le vrai nom de la classe.OriginalL'auteur
Je pense que
dynamic_cast
peut-être ce que vous cherchez.Il ne vous donne pas le nom de la classe, mais il échoue dans la façon dont vous souhaitez que votre affirmation à l'échec, sauf que les sous-classes de
Blah
ne sera pas pris.OriginalL'auteur
Je ne pense pas qu'il soit non-spécifiques de compilateur solution à un tel problème, qui n'implique pas beaucoup de macros dans la déclaration de la classe (en fait si j'ai bien compris la documentation de QT la chaîne que vous obtenez avec
objectName
est affectée "par la main", je pense qu'avec le code créé parmoc
).D'autre part, en général, pour vérifier si la classe d'un objet que vous ne voulez pas vous ne devriez pas faire une comparaison de chaîne, mais au lieu de faire un typeid comparaison.
Mais vous devriez probablement mieux expliquer ce que vous essayez d'atteindre.
OriginalL'auteur
QObject->metaObject() la méthode est valable pour Qt à l'exception de la QGraphicsItem en fonction des classes qui héritent pas de QObject...
OriginalL'auteur
Oui, norme ne nécessite pas de mise en œuvre de l'utiliser tout de nommage spécifique, de sorte qu'il peut changer même pour le même compilateur.
Il n'y a aucun équipement standard qui retourne le nom de classe dans certains canoniques de forme.
OriginalL'auteur