Reconnaissance de types d'objets en c++

Contenu du snippet

On vous l'a maintes fois répété : En C++, il n'est pas possible de connaître le type d'un objet durant l'exécution...et bien non, c'est tout a fait possible ! Moyennant la mise en ?uvre de RTTI (Run Time Type Information).

Les puristes vous diront que le langage objet est fait pour se délester des problèmes de typage grâce aux fonctions virtuelles. Certes, mais une astuce reste une astuce et des fois ça peut nous sortir du pétrin donc autant en faire profiter !

Le mécanisme de reconnaissance d'objet se réalise avec la classe type_info et l'opérateur typeid. La fonction name() renvoie le nom de la class préfixé par le mot class (suivant l'implémentation qui a été faite sur votre version).

Grâce à cette astuce vous ne serez plus obligé d'implémenter vous même les types de vos classe sous forme de chaîne dans la classe même (il y en a beaucoup qui le font).

Source / Exemple :


#include <iostream>
#include <typeinfo>

using namespace std;

class A
{
	public:
	    A(){}
	    virtual ~A(){};
};

class B : public A 
{
};

int main (int, char**)
{
	A a;
	B b;

	cout << "la classe A est de type : " << typeid(A).name() << endl; 
	cout << "a est de type : " << typeid(a).name() << endl; 
	cout << "b est de type : " << typeid(b).name() << endl; 

	A a2;

	cout << "type[a2] == type[a] ? " << (typeid(a) == typeid(a2)) << endl; 
	cout << "type[a2] == type[b] ? " << (typeid(a) == typeid(b)) << endl; 

	A * pa = new A;
	A * pb = new B;

	cout << "pa est de type : " << typeid(*pa).name() << endl; 
	cout << "pb est de type : " << typeid(*pb).name() << endl; 

}

----------------------------------------------------------
la classe A est de type : class A
a est de type : class A
b est de type : class B
type[a2] == type[a] ? 1
type[a2] == type[b] ? 0
pa est de type : class A
pb est de type : class B
----------------------------------------------------------

Conclusion :


Vous remarquerez que la fonction name() renvoie le nom de la class préfixée par le mot class.
N'oubliez pas d'activer enable RunTime Type Info dans Visual Studio (option de compilation /GR) .

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.