【C++】类模板特化的内置类型和自定义类型拷贝的实现

1、类型

#include <iostream>

using namespace std;

// 对应内置类型
struct TrueType
{
	static bool Get()
	{
		return true;
	}
};

// 对应自定义类型
struct FalseType
{
	static bool Get()
	{
		return false;
	}
};

2、模板特化

// 处理自定义类型
template<class T>
struct Typetraits
{
	typedef FalseType IsPODType;
};

// 内置类型
template<>
struct Typetraits<int>
{
	typedef TrueType IsPODType;
};

template<>
struct Typetraits<double>
{
	typedef TrueType IsPODType;
};

template<>
struct Typetraits<char>
{
	typedef TrueType IsPODType;
};

3、两种类型拷贝

template <class T>
void Copy(T* dst, const T* src, size_t size)
{
	// T-->int Typetaits<int>走已经特化的模板,IsPODType是TrueType的别名
	//         Typetaits<T>::IsPODType===>typetaits<int>::IsPODType::Get()---->return true

	// T-->Date Typetaits<Date>走未特化的模板,IsPODType是FalseType的别名
	//         Typetaits<T>::IsPODType===>typetaits<Date>::IsPODType::Get()---->return false

	// 1.内置类型
	if (Typetraits<T>::IsPODType::Get())
	{
		memcpy(dst, src, sizeof(T)*size);
	 }
	else
	{
		// 2.自定义类型
		for (size_t i = 0; i < size; i++)
			dst[i] = src[i];
	 }
}

4、string

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

	String(const String& str)
		: _str(nullptr)
	{
		String temp(str._str);
		swap(_str, temp._str);
	}

	String& operator=(String& s)
	{
		swap(_str, s._str);
		return *this;
	}

	~String()
	{
		if (_str)
		{
			delete[] _str;
			_str = nullptr;
		}
	}
private:
	char* _str;
};

5、测试代码

int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
	int arr2[10] = { 0 };
	Copy(arr2, arr, 10);

	String s1[] = { "1111", "2222", "3333", "4444" };
	String s2[4];
	Copy(s2, s1, 4);
	return 0;
}

6、编译出现错误

错误
error C4996: ‘strcpy’: This function or variable may be unsafe.
Consider using strcpy_s instead.

解决方法:
①右击【项目名称】在这里插入图片描述
②点击【属性】
在这里插入图片描述
③预处理定义(C/C++ —> 预处理器 —> 预处理定义)
在这里插入图片描述
④输入【_CRT_SECURE_NO_WARNINGS】
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值