C++ 从模板参数获取qt元对象类型名称
在qt中,可以使用元对象系统通过调用C++ 从模板参数获取qt元对象类型名称,c++,qt,qt4,C++,Qt,Qt4,在qt中,可以使用元对象系统通过调用QMetaMethod::parameterTypes()来获取插槽参数的类型名称。 例如,对于void someSlot(SomeClass c)返回“SomeClass” 有没有办法从模板参数中获得相同的类型名? 也就是说,我想调用somehowGetName(),并得到“SomeClass” 重要的是,返回的名称与qt使用的名称完全相同,并且可以在所有编译器上使用。因此,解析type_info::name()的输出不是一个解决方案 如果有可能,应避免使用
QMetaMethod::parameterTypes()
来获取插槽参数的类型名称。
例如,对于void someSlot(SomeClass c)代码>返回“SomeClass”
有没有办法从模板参数中获得相同的类型名?
也就是说,我想调用somehowGetName()
,并得到“SomeClass”
重要的是,返回的名称与qt使用的名称完全相同,并且可以在所有编译器上使用。因此,解析type_info::name()
的输出不是一个解决方案
如果有可能,应避免使用宏。还要注意,SomeClass
不会继承QObject
因此,我可能要问的是,是否有一种方法可以获取给定类型的qts内部名称。您是否尝试过对类型\ u info::name()的结果进行demangling:
正如我上面所说:“解析类型_info::name()的输出不是一个解决方案。”我认为上面的代码可能满足“重要的是,返回的名称正是qt使用的名称,并且它可以在所有编译器上工作。”这就是为什么我提供了可能的解决方案。我认为对你的问题的简短回答是,不,但是你可以总是修补Qt来提供你想要的功能,或者简单地使用他们正在使用的相同类型名提取逻辑。因为它是Qt,所以它们很可能会像我上面所做的那样对每个编译器进行宏运算。
inline QString demangle(const char *name)
{
#if (__GNUC__ && __cplusplus && __GNUC__ >= 3)
int status = 0;
QString result = "";
char *realname = abi::__cxa_demangle(name, NULL, NULL, &status);
realname == NULL ? result = name : result = realname;
free(realname);
return result;
#else
return name;
#endif
}