Programowe pobieranie nazwy klasy c++
Zastanawiałem się, czy w C++ możliwe jest pobranie nazwy klasy w postaci łańcuchowej bez konieczności kodowania jej na twardo do zmiennej lub gettera. Zdaję sobie sprawę, że żadna z tych informacji nie jest faktycznie używana w czasie wykonywania, dlatego jest niedostępna, ale czy są jakieś makra, które można zrobić, aby stworzyć tę funkcjonalność?
Edit: może być pomocne, aby zauważyć, że w rzeczywistości próbuję odzyskać nazwę pochodnej klasy i używam Visual C++ 2008 Express Edition.
3 answers
Możesz użyć typeid
:
#include <typeinfo>
cout << typeid(obj).name() << endl;
Jest to jednak zniechęcające, ponieważ format nie jest znormalizowany i może się różnić między różnymi kompilatorami (lub nawet różnymi wersjami tego samego kompilatora).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-24 09:14:32
Jeśli chcesz tylko sprawdzić, czy jest to pewna Klasa, to
typeid(obj) == typeid(CSubClass)
Będzie zawsze działać niezależnie od implementacji.
W przeciwnym razie wygodnym sposobem jest zadeklarowanie:
virtual const char* classname() { return "CMyClass";}
I zaimplementować na podklasę.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-16 19:32:51
TypeID(obj).name() zawsze podaje typ zmiennej tak, jak została zadeklarowana, a nie rzeczywisty typ (Klasa) obiektu. Jeśli zmienna obj jest przypisana do instancji podklasy klasy, jako której zadeklarowano obj, typeid niestety tego nie ujawnia.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-11 01:27:53