Operatorn typeid

För det mesta behöver vi som programmerare inte känna till ett objekts dynamiska typ, men om så skulle behövas kan detta göras med operatorn typeid.

För att använda sig av denna operator skall man inkludera filen

Operatorn typeid returnerar ett värde av klassen typeinfo (vars klassdefinition finns i ovan nämda fil) så att man t.ex. kan jämföra de dynamiska typerna hos utpekade objekt. För klassen typeinfo finns bland annat jämförelseoperatorerna == och != definierade samt en medlemsfunktion name() som returnerar en textsträng med klassens namn.

Syntax

typeid(operand)	// operanden kan liksom hos sizeof operatorn vara en typ eller ett uttryck.
Beskrivning

typeid kan användas för att erhålla runtime identifiering av typer och uttryck. Ett anrop till typeid returnerar en referens till ett objekt av typen const typeinfo. Det returnerade objektet representerar typen hos operanden. Om operanden är en avrefererad pekare eller en referens till en polymorfisk typ så returneras den dynamiska typen hos det utpekade/refererade objektet annars returneras operandens statiska typ.

Exempel

Antag att vi har en klass hierarki som i exemplet med schack pjäserna.

Pjas * ptr;

Torn pjas1;
Drottning pjas2;

ptr = &pjas1;

if (typeid(*ptr) == typeid(Kung))
	cout << "Detta är en kung" << endl;

cout << typeid(12+5.2).name() << endl;	// float
cout << typeid(pjas2).name() << endl;		// Drottning

cout << typeid(ptr).name() << endl;		// Pjas *	Den statiska typen
cout << typeid(*ptr).name() << endl;		// Kung	Den dynamiska typen
Klassen typeinfo

Kraftigt förenklat så är klassen typeinfo definierad på följande sätt:

class typeinfo
{
public:
	tpid * tpp;
	virtual ~typeinfo();
	int operator==(const typeinfo &) const;
	int operator!=(const typeinfo &) const;
	int before(const typeinfo &) const;
	const char * name() const;
private:
	typeinfo(const typeinfo &);
	typeinfo & operator=(const typeinfo &);
};