Вы действительно не должны полагаться ни на std::typeid
, ни на boost или любые другие C ++ - only-library . Ни один из них не гарантирует, что вы получите имя типа, особенно с искаженными типами, на разных компиляторах. Используя виртуальную функцию, даже RTTI может влиять на название типа. Ничто не мешает вашему компилятору переименовать «MainWindow» в «CellarDoor». Пока единственный способ go - это использовать какой-то тип Reflection (который пока не является частью C ++) или какой-то препроцессор. ComicSansMS предоставил хороший ответ , где вы катите свою собственную простую реализацию отражения.
Однако, поскольку вы используете QT, вы можете использовать для этого метаобъекты QT . На самом деле у него есть метод, предназначенный именно для этой цели; className .
QMetaObject :: className () возвращает имя класса в виде строки во время выполнения, не требуя поддержки собственной информации типа времени выполнения (RTTI) через C ++ компилятор.
Просто вызовите metaObject()->className()
:
MainWindow::MainWindow(QWidget *parent) {
qDebug() << metaObject()->className();
}
mo c запускается перед любым компилятором и запекает имя класса в коде. Глядя на сгенерированный код mo c, вы увидите что-то вроде:
static const qt_meta_stringdata_MainWindow_t qt_meta_stringdata_MainWindow = {
{
QT_MOC_LITERAL(0, 0, 10), // "MainWindow"
QT_MOC_LITERAL(1, 11, 13), // "buttonClicked"
QT_MOC_LITERAL(2, 25, 0) // ""
},
"MainWindow\0buttonClicked\0"
};