QVariant源码解析

本文深入探讨QVariant的实现原理,包括其类型安全特性、内存管理和qRegisterMetaType的作用。QVariant通过qRegisterMetaType注册自定义类型,利用构造函数和析构函数实现类型安全。在内存管理上,QVariant使用共享指针进行优化,减少内存分配。当创建QVariant时,会根据类型调用构造函数并存储值。拷贝QVariant时,若涉及自定义类型,会使用共享内存,而修改QVariant的值会触发detach,分离共享状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值