C++ Qt:typeid替代方案
我想知道Qt是否提供了typeid的替代方法来识别变量类型并以人类可读的格式获取它们的名称。 我的具体问题如下:C++ Qt:typeid替代方案,c++,qt,qtcore,typeinfo,C++,Qt,Qtcore,Typeinfo,我想知道Qt是否提供了typeid的替代方法来识别变量类型并以人类可读的格式获取它们的名称。 我的具体问题如下: struct gArgument{ QString type; void* arg; }; void gargConverter(gArgument* oArg, T data){ oArg->type = typeid(data).name(); oArg->arg = static_cast<void*> (&d
struct gArgument{
QString type;
void* arg;
};
void gargConverter(gArgument* oArg, T data){
oArg->type = typeid(data).name();
oArg->arg = static_cast<void*> (&data);
}
有什么建议吗?您可以使用:
const char*QVariant::typeName()const
返回变量中存储的类型的名称。返回的字符串描述了用于存储数据的C++数据类型:例如“QFoT”、“qStand”或“QValueListList.”。无效变量返回0
这将适用于POD和已注册的内置Qt类型。不过,您需要使用注册表来注册自定义类型
int qRegisterMetaType(const char*typeName)
您还可以尝试另一件事,尽管QVariant
有些多余,但它是以以下方式使用对象的QMetaObject:
const char*QMetaObject::className()const
返回类名
及
const QMetaObject*QObject::metaObject()const[virtual]
返回指向此对象的元对象的指针
元对象包含有关继承QObject的类的信息,例如类名、超类名、属性、信号和插槽。包含Q_OBJECT宏的每个QObject子类都将有一个元对象
信号/插槽连接机制和属性系统需要元对象信息。函数的inherits()还使用元对象
如果没有指向实际对象实例的指针,但仍希望访问类的元对象,则可以使用staticMetaObject
不用说,这只适用于QObject,因此不适用于QString等。您需要创建QObject子类
还有一些QMetaType
可以用于创建,但有点不同,所以我在这里只是完整地提一下:
int-QMetaType::type(const-char*typeName)[静态]
返回名为typeName的类型的句柄,如果没有此类类型,则返回QMetaType::UnknownType
在这里您可以找到所有类型:
看起来您正在尝试获取通用变量,类似于。
QVariant
适用于所有基本类型和所有Qt类型。其他类型可以添加到qt元数据系统。您得到的类型名称已损坏。这很好,因为行为是由实现定义的。为了让它更易于阅读,您需要在会损坏名称的编译器(gcc和llvm)上对名称进行demangle
下面是G++、LLVM C++、MS Visual C++的工作,所以它的可移植性是合理的。
#包括
#ifndef\u理学硕士
#包括
#恩迪夫
结构QEvent{virtual~QEvent(){};
struct MyEvent:public QEvent{};
#ifndef\u理学硕士
模板无效转储类型(T val)
{
智力状态;
char*realname=abi::uucxa_demangle(typeid(val).name()、0、0和状态);
std::我是否可以认为您程序的输出是预期的输出。如果我更改变量I
、d
和f
,它仍然会给我这些字符串。typeid::name()输出的准确拼写是定义的实现,它似乎给了一个与C++的名字相关的名字,这是有意义的,实际上,Typeinfo在系统上工作。为什么你觉得有问题?你可能不需要QT。大多数C++实现提供你需要的,虽然它是编译的。特定于r的程度。@n.m.我希望输出类似于,即“int”、“QString”、“double”等,但我知道这完全依赖于编译器。@LaszloPapp是的,我切换到了QVariant,谢谢!)
int i; std::cout << typeid(i).name() << std::endl;
QString s; std::cout << typeid(s).name() << std::endl;
double d; std::cout << typeid(d).name() << std::endl;
float f; std::cout << typeid(f).name() << std::endl;
i
7QString
d
f
int
QEvent
MyEvent
int
class QEvent
class MyEvent