定义一个类模板
template <template parameter list>
class ClassName
{
// do something
};
参数:
1、类型参数
typename T1
2、非类型参数
int 200
注意:在类外部编写成员函数时,第一行必须加上template <typename T>
从非const变为const:std::as_const
从const变为非const:const_cast<>
下面是const版本来实现非const重载
ReturnType Class::Function(Arguments)
{
return const_cast<ReturnType>(std::as_count(*this).Function(Arguments));
}
#include <iostream>
#include <string>
using namespace std;
template <typename T>
class Array {
private:
T* p;
size_t size;
public:
explicit Array(size_t arraySize);
Array(const Array& array);
~Array();
T& operator[](size_t index);
const T& operator[](size_t index) const;
Array& operator=(const Array& rhs);
void swap(Array& other) noexcept;
size_t GetSize() const
{
return size;
}
};
template <typename T>
Array<T>::Array(size_t arraySize):
size{ arraySize },
p{new T[arraySize]}
{}
template <typename T>
Array<T>::Array(const Array& array):
size{ array.size }
{
for (size_t t = 0; t < size; t++) {
p[t] = array.p[t];
}
}
template <typename T>
Array<T>::~Array()
{
delete[] p; // 注意这里删除的是数组
}
//template <typename T>
//T& Array<T>::operator[](size_t index)
//{
// if (index >= size) {
// throw std::out_of_range("index is too large " + std::to_string(index));
// }
// return p[index];
//}
//
// const 版本和非const基本上一样,可以尝试用const版本实现非const版本
template <typename T>
const T& Array<T>::operator[](size_t index) const
{
if (index >= size) {
throw std::out_of_range("index is too large " + std::to_string(index));
}
return p[index];
}
template <typename T>
T& Array<T>::operator[](size_t index)
{
if (index >= size) {
throw std::out_of_range("index is too large " + std::to_string(index));
}
return const_cast<T&>(std::as_const(*this)[index]);
}
template <typename T>
void Array<T>::swap(Array& other) noexcept
{
std::swap(p, other.p);
std::swap(size, other.size);
}
template <typename T>
Array<T>& Array<T>::operator=(const Array& rhs)
{
if (&rhs != this) // 检查左右操作数是否相同必不可少
{
Array<T> copy{ rhs };
swap(copy); // 这里不能使用std::swap(),因为它会调用赋值运算符,导致无限递归
}
return *this;
}
int main()
{
Array<int> data(40);
int n = data.GetSize();
for (size_t t = 0; t < data.GetSize(); t++) {
data[t] = t * t;
}
try {
cout << data[2] << endl;
cout << data[40] << endl;
}
catch (const std::out_of_range& ex) {
cout << "out_of_range" << ex.what()<< endl;
}
return 0;
}
非类型的类模板参数
const int start = 1; // 注意:必须要加const
Array<double, start> values{ 21 };
类模板特化
template<>
class Array<const char*>
{
};