typeof() pour c++ ?
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'execution...et bien non, c'est tout a fait possible ! moyennant la mise en oeuvre 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
exemple:
- #include
- #include
-
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()
- cout "a est de type : " typeid(a).name()
- cout "b est de type : " typeid(b).name()
-
- A a2;
-
- cout "type[a2] == type[a] ? " typeid(a) ==
typeid
(a2))
- cout "type[a2] == type[b] ? " typeid(a) ==
typeid
(b))
-
- A * pa =
new
A;
- A * pb =
new
B;
-
- cout "pa est de type : " typeid(*pa).name()
- cout "pb est de type : " typeid(*pb).name()
-
-
- }
-
- ----------------------------------------------------------
- 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
- ----------------------------------------------------------
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) .
Paru aussi sur cppfrance