模板:
【优点】
- 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生
- 增强了代码的灵活
【缺陷】
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;
}