typeid
Megjelenés
Főnév
typeid (tsz. typeids)
- (informatika) A
typeida 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 egyconst 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), nemDerived.
📂 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ásbefore(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 |