C++ 从模板参数获取qt元对象类型名称

C++ 从模板参数获取qt元对象类型名称,c++,qt,qt4,C++,Qt,Qt4,在qt中,可以使用元对象系统通过调用QMetaMethod::parameterTypes()来获取插槽参数的类型名称。 例如,对于void someSlot(SomeClass c)返回“SomeClass” 有没有办法从模板参数中获得相同的类型名? 也就是说,我想调用somehowGetName(),并得到“SomeClass” 重要的是,返回的名称与qt使用的名称完全相同,并且可以在所有编译器上使用。因此,解析type_info::name()的输出不是一个解决方案 如果有可能,应避免使用

在qt中,可以使用元对象系统通过调用
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
}