Man kan även få information från en datatyp om vilken typ det är frågan om. I normala fall vet man
vilken datatyp det är då det är frågan om primitiva datatyper, men vid arvshierarkier och med pekare
till basklasser kan man inte alltid vara säker. Man kan i sådana fall använda sig av t.ex. någon
inbyggd metod eller så dynamic_cast för att försöka konvertera objektet till
någon viss klass. Ett alternativt sätt är att använda en annan ny finess hos C++, man kan nämligen
få ut en id för varje objekt som säger vilken datatyp det är frågan om. Denna
id kan användas för att jämföra om två objekt är av samma typ. Funktionen som ger informationen
heter typeid() och returnerar en referens till en klass
const type_info. Denna funktion kan användas efter att headerfilen
<typeinfo> inkluderats. Ett exempel på hur
typeinfo() kan användas:
#include <typeinfo>
void foobar (A * Data) {
// hämta information om 'Data'
const type_info & Info = typeid ( *Data );
cout << "Typen = " << Info.name () << endl;
} |
Vi måste ha en referens till en type_info för returvärdet från
typeid(). Notera att funktionen returnerar typen på dess parameter, så
skickar vi t.ex. en pekare får vi ut som information att det är en pekare till någon datatyp, därför
avrefereras Data innan den skickas som parameter. Klassen
type_info har överlagrade operatorer (se Kapitel 21) som tillåter jämförelse (== och
!=) mellan olika instanser av type_info. En metod
name() finns tillgänglig ifall man vill använda en strängrepresentation av
datatypen till något, t.ex. till en map över olika klasser.