QVariant可以支持任意类型的存储,功能有点类似于boost中的any,但是实现却完全不同,它同样是类型安全的,而且代价更小
要熟悉QVariant,我们需要先看下qRegisterMetaType的源码
先简单看下如何使用QVariant
void CTestVariant::Test()
{
int iNewType = qRegisterMetaType<CVariantHelp>("CVariantHelp");// 先注册一个QT认识的类型
CVariantHelp a1;
QVariant aa(iNewType, &a1);// 告诉QVariant类型及值。这样QVariant就记下了,下次取的时候判断会判断类型,这样实现类型安全
{
QVariant bb = aa;
}
// 取值
int itype = aa.userType();
assert(itype == iNewType);
CVariantHelp* pB = reinterpret_cast<CVariantHelp*>(aa.data());
}
qRegisterMetaType源码,传入一个T的类型,typename值
template <typename T>
int qRegisterMetaType(const char *typeName)
{
typedef void*(*ConstructPtr)(const T*); // 定义一个构造函数,接受参数T*的值,返回void*
// 这是一个全局函数,T决定了不同的T会编译出不同的全局函数,cptr保存类型为T的qMetaTypeConstructHelper的全局函数
ConstructPtr cptr = qMetaTypeConstructHelper<T>;
typedef void(*DeletePtr)(T*);
DeletePtr dptr = qMetaTypeDeleteHelper<T>;
return QMetaType::registerType(t