C++ QMetaType::模板类型中的类型

C++ QMetaType::模板类型中的类型,c++,qt,templates,qmetatype,C++,Qt,Templates,Qmetatype,是否可以确定模板参数的QMetaType::Type值 我试过这个: template <class T> class MyClass { public: int getType() { return QMetaType::type(typeid(T).name()); } }; 模板 类MyClass{ 公众: int getType(){ 返回QMetaType::type(typeid(T).name()); } }; 但是它总是返回0(QM

是否可以确定模板参数的QMetaType::Type值

我试过这个:

template <class T>
class MyClass {
public:
    int getType() {
        return QMetaType::type(typeid(T).name());
    }
};
模板
类MyClass{
公众:
int getType(){
返回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)
MyClass().getType();//2(QMetaType::Int)
MyClass().getType();//10(QMetaType::QString)
MyClass().getType();//19(QMetaType::QRect)
MyClass().getType();//1024(由qRegisterMetaType设置)

我在Qt5.12.4上测试了您的代码,它似乎可以工作。 您还可以Q_DECLARE_元类型来注册您的自定义类型,然后使用()来获取元类型id

下面是我的测试代码和示例:

#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();
}

我在Qt5.12.4上测试了您的代码,它似乎可以工作。 您还可以Q_DECLARE_元类型来注册您的自定义类型,然后使用()来获取元类型id

下面是我的测试代码和示例:

#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();
}

您必须通过
Q\u DECLARE\u METATYPE
注册该类型,否则它将返回
UnknownType
。不知道您所说的
Qt使用的类型名称与编译器不同,但这不是您的问题。@Jaa-c不。它也不适用于Qt类型。Qt名称:QMetaType::type(“QString”)=QMetaType::QString;QMetaType::type(“int”)=QMetaType::int.编译器名称:typeid(QString).name()=“7QString”;typeid(int).name()=“i”。它们不匹配。抱歉,我错过了您使用的
typeid()
。显然,如果它不返回所需的值,就不能使用它。一种可能是使用
metaObject()->className()
,但这需要一个实例。另一种可能是使用
boost::typeindex::type\u id().pretty\u name()
,因为它通常返回类的名称。您必须通过
Q\u DECLARE\u METATYPE
注册该类型,否则它将返回
UnknownType
。不知道您所说的
Qt使用的类型名称与编译器不同,但这不是您的问题。@Jaa-c不。它也不适用于Qt类型。Qt名称:QMetaType::type(“QString”)=QMetaType::QString;QMetaType::type(“int”)=QMetaType::int.编译器名称:typeid(QString).name()=“7QString”;typeid(int).name()=“i”。它们不匹配。抱歉,我错过了您使用的
typeid()
。显然,如果它不返回所需的值,就不能使用它。一种可能是使用
metaObject()->className()
,但这需要一个实例。另一种可能是使用
boost::typeindex::type_id().pretty_name()
,因为它通常返回类的名称。