Ugrás a tartalomhoz

typeid

A Wikiszótárból, a nyitott szótárból


Főnév

typeid (tsz. typeids)

  1. (informatika) A typeid a C++ nyelv egy kulcsszava és operátora, amely lehetővé teszi, hogy futtatási időben vagy fordítási időben információt szerezzünk egy típus nevéről vagy típusáról. Az eredmény egy const std::type_info& típusú referencia, amelyet az <typeinfo> fejléccel kell használni.



🧠 Mire jó a typeid?

  • Lekérdezni egy objektum vagy típus nevét futás közben.
  • Ellenőrizni, hogy két típus azonos-e.
  • Polimorf osztályoknál megállapítani a valódi (dinamikus) típust.
  • Hibakeresésre, naplózásra, debugolásra.



📦 Alap szintaxis

#include <iostream>
#include <typeinfo>

int main() {
    int a = 5;
    std::cout << typeid(a).name() << std::endl;
}

Ez kiírja: i (vagy valami mást, fordítótól függően – pl. int demangled formában).



🔍 Típusnév lekérdezése

#include <typeinfo>

double d = 3.14;
std::cout << typeid(d).name() << '\n';  // rendszerfüggő eredmény, pl. "d"
  • A name() függvény által visszaadott név nem szabványosított, az implementációtól függ (pl. GCC-nél mangled, pl. i, d, stb.).
  • Lehet használni abi::__cxa_demangle()-t (GCC) a visszafejtéshez.



📚 Két típus összehasonlítása

int x = 10;
float y = 5.0f;

if (typeid(x) == typeid(y)) {
    std::cout << "Azonos típus" << std::endl;
} else {
    std::cout << "Különböző típus" << std::endl;
}

🧩 Polimorf osztályok és dinamikus típus

#include <iostream>
#include <typeinfo>

class Base {
public:
    virtual ~Base() = default;
};

class Derived : public Base {};

int main() {
    Base* b = new Derived;

    std::cout << typeid(*b).name() << '\n';  // Megjeleníti: Derived (demangled formában)
}
  • Ha a bázisosztály nem polimorf (nincs benne virtuális függvény), akkor typeid(*ptr) statikus típust ad vissza, nem a valódit.



🔒 Előfeltétel

  • Polimorf típus kell a valódi típus megállapításához pointereken keresztül.
  • Ha nem polimorf, typeid(*ptr) → fordításkori típus (Base), nem Derived.



📂 type_info osztály

A typeid operátor visszatérési típusa: const std::type_info&

Használható függvényei:

const std::type_info& info = typeid(something);

std::cout << info.name();      // implementációfüggő string
std::cout << info.hash_code(); // egyedi hash érték

Operátorok:

  • ==, !=: összehasonlítás
  • before(other): lexikografikus sorrend, nem igazán használatos általános célra



⚠️ Buktatók

Probléma Részlet
Nem polimorf típus typeid nem ad dinamikus típust
Mangled név name() gyakran gépi formátum, nem emberi olvasású
Túlhasználat Néha rossz design jele – a típusellenőrzést általában sablonokkal vagy virtuális függvényekkel végezzük



💡 Alternatívák

  • std::variant + std::visit – típusbiztos diszkrét típuskezelés
  • Sablonok – fordításkori típusfelismerés
  • Virtuális függvények – futásidejű viselkedés eldöntéshez



✅ Összegzés

Tulajdonság Részletek
Kulcsszó typeid
Visszatérési típus const std::type_info&
Függvények .name(), .hash_code()
Előny Futásidőben lekérdezhető típus
Használat Debug, polimorfia ellenőrzés, típusazonosítás