通用拷贝函数

59 篇文章 0 订阅
40 篇文章 0 订阅

模板:
【优点】

  1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生
  2. 增强了代码的灵活

【缺陷】

1.模板会导致代码膨胀问题,也会导致编译时间变长
2.出现模板编译错误时,错误信息非常凌乱,不易定位错误

通用的拷贝函数
这里结合两者优点将(内置类型使用memcpy ) (自定义类型使用赋值)
1.枚举类型判断
2.类型萃取(这里只列举部分内置类型)

//写一个通用的拷贝函数

class String
{
public:
	String(const char* str = "")
	{
		if (nullptr == str)
			str = "";
		_str = new char[strlen(str) + 1];
		strcpy(_str, str);

	}
	String(const String& s)
		:_str(new char[strlen(s._str) + 1])
	{
		strcpy(_str, s._str);
	}
	String& operator=(const String& s)
	{
		if (this != &s)
		{
			char* pStr = new char[strlen(s._str) + 1];
			strcpy(pStr, s._str);
			delete[] _str;
			_str = pStr;
		}
		return *this;
	}
	~String()
	{
		if (_str != nullptr)
		{
			delete[] _str;
			_str = nullptr;
		}
	}
private:
	char* _str;
};

///使用TrueType代表内置类型
struct TrueType
{
	static bool Get()
	{
		return true;
	}
};

///使用FalseType代表内置类型
struct FalseType
{
	static bool Get()
	{
		return false;
	}
};

template<class T>
struct TypeTraits
{
	typedef FalseType PODTYPE;
};


template<>
struct TypeTraits<char>
{
	typedef TrueType PODTYPE;
};
template<>
struct TypeTraits<short>
{
	typedef TrueType PODTYPE;
};
template<>
struct TypeTraits<int>
{
	typedef TrueType PODTYPE;
};
template<>
struct TypeTraits<float>
{
	typedef TrueType PODTYPE;
};
template<>
struct TypeTraits<double>
{
	typedef TrueType PODTYPE;
};
template<>
struct TypeTraits<long>
{
	typedef TrueType PODTYPE;
};
template<class T>
void Copy(T* dst, T* src, size_t size)
{
	
	
	//结合两者优点将内置类型使用memcpy     自定义类型使用赋值
	//1.枚举类型判断
	//2.类型萃取
	if (TypeTraits<T>::PODTYPE::Get())
	{
		//优点:效率高
		//缺点:浅拷贝
		memcpy(dst, src, sizeof(T)*size);
	}
	else
	{
		//优点:一定不会出错
		//缺点:效率低
		for (size_t i = 0; i < size; i++)
			dst[i] = src[i];
	}
	
}
int main()
{
	int a = 1;
	int arr[] = { 0,1,2,3,4,5,6,7,8,9 };
	int arr1[10];
	Copy(arr1, arr, 10);

	String s1[] = { "111","222","333" };
	String s2[3];
	Copy(s2, s1,3);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值