【干货】C++通过模板特化实现类型萃取实例--实现区分基本类型与自定义类型的memcpy

本文介绍了如何使用C++的模板特化技术来实现类型萃取,以区别处理基本类型和自定义类型的memcpy操作。通过创建特定的类和模板,避免了在拷贝string等复杂类型时可能出现的问题,如析构两次的错误。示例代码展示了如何定义和实现模板以确保正确处理不同类型的数据。
摘要由CSDN通过智能技术生成

    类型萃取是一种常用的编程技巧,其目的是实现不同类型数据面对同一函数实现不同的操作,如STL中cout的实现,它与类封装的区别是,我们并不用知道我们所调用的对象是什么类型,类型萃取是编译器后知道类型,先实现,而类的封装则是先定义类型,后实现方法。在这里我们可以用模板的特化实现其编程思想。

    我们以memcpy为例,当我们拷贝的是基本类型时,只用拷贝所传递指针上的数据,如果是string类型呢,我们则需要在堆上开辟空间,所传递的指针如果被直接复制,则有可能(vs下的string类型的实现原理是若字符串不长则以数组保存,若字符串过长,则通过指针在堆上开辟空间进行保存)出现同一地址,析构两次这样的常见错误。

    在这里我们需要在一个头文件中定义两个类,用来区分是否是基本类型,代码如下:

struct __TrueType//基本类型
{
	bool Get()
	{
		return true;
	}
};

struct __FalseType//非基本类型
{
	bool Get()
	{
		return false;
	}
};

    其次定义类模板,使基本类型特化,非基本类型则不需用特化:

template <class _Tp>//非基本类型不特化
struct TypeTraits
{
	typedef __FalseType   __IsPODType;
};

template <>//基本类型的全特化
struct TypeTraits< bool>
{
	typedef
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值