Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt:typeid替代方案_C++_Qt_Qtcore_Typeinfo - Fatal编程技术网

C++ 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

我想知道Qt是否提供了typeid的替代方法来识别变量类型并以人类可读的格式获取它们的名称。 我的具体问题如下:

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