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.

Author: Cœur, 2009-06-22

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).

 86
Author: Konrad Rudolph,
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ę.

 35
Author: fchen,
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.

 9
Author: jbillfinger,
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