QMetaType::Тип из типа шаблона

Можно ли определить QMetaType::Type значение аргумента шаблона.

Я пробовал это:

template <class T>
class MyClass {
public:
    int getType() {
        return QMetaType::type(typeid(T).name());
    }
};

Но это всегда возвращает 0 (QMetaType::UnknownType), потому что Qt использует имена типов, отличные от компилятора.

Это должно работать следующим образом:

MyClass<int>().getType();     // 2 (QMetaType::Int)
MyClass<QString>().getType(); // 10 (QMetaType::QString)
MyClass<QRect>().getType();   // 19 (QMetaType::QRect)
MyClass<MyType>().getType();  // 1024 (Set by qRegisterMetaType)

person Thomas Klier    schedule 18.09.2017    source источник
comment
Вы должны зарегистрировать этот тип через Q_DECLARE_METATYPE, иначе он вернет UnknownType. Не знаю, что вы имеете в виду под Qt uses different type names than the compiler, но это не ваша проблема.   -  person Jaa-c    schedule 18.09.2017
comment
@ Jaa-c Нет. Это тоже не работает с типами Qt. Имена Qt: QMetaType::type(QString)=QMetaType::QString; QMetaType::type(int)=QMetaType::Int. Имена компиляторов: typeid(QString).name()=7QString; идентификатор типа(int).name()=i. Они не совпадают.   -  person Thomas Klier    schedule 18.09.2017
comment
Извините, я пропустил, что вы использовали typeid(). Очевидно, вы не можете использовать это, если оно не возвращает нужное вам значение. Одной из возможностей было бы использование metaObject()->className(), но для этого требуется экземпляр. Другая возможность — использовать boost::typeindex::type_id<T>().pretty_name(), так как он обычно возвращает имя класса.   -  person Jaa-c    schedule 18.09.2017


Ответы (1)


Я протестировал ваш код на Qt 5.12.4, и он работает. Вы также можете Q_DECLARE_METATYPE зарегистрировать свой собственный тип, а затем использовать qMetaTypeId( ), чтобы получить идентификатор метатипа.

Вот мой тестовый код и пример:

#include <QCoreApplication>
#include <QDebug>
#include <QMetaType>
#include <QRect>
#include <QMetaObject>

class MyType
{
public:
    int _member;
};
// needed for getType2()
Q_DECLARE_METATYPE(MyType);
// needed for getType()
const int id = qRegisterMetaType<MyType>("MyType");

template <class T>
class MyClass {
public:
    int getType() {
        return QMetaType::type(typeid(T).name());
    }
    int getType2() {
        return qMetaTypeId<T>();
    }

};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    qDebug() << MyClass<int>().getType();
    qDebug() << MyClass<QString>().getType();
    qDebug() << MyClass<QRect>().getType();
    qDebug() << MyClass<MyType>().getType();

    qDebug() << MyClass<int>().getType2();
    qDebug() << MyClass<QString>().getType2();
    qDebug() << MyClass<QRect>().getType2();
    qDebug() << MyClass<MyType>().getType2();

    return a.exec();
}

это выводит:

2
10
19
1024
2
10
19
1024
person Alexander A.    schedule 14.09.2020