目录
为了解决,一些内容相同,只是类型不同的class和func而产生的代码冗余,而产生。
函数模板:
//template<class T>
//可以多个模板参数,
template<class T, class A = int, class B = int>
void func(T a, T b) {
cout << typeid(a + b).name() << endl;
}
void func(int a, int b) {
//func(int a, int b)相对于模板函数template<class A = int, class B = int, class T>void func(T a, T b),
// 属于模板的特化,当显示实例化为特化所表示的类型,或者编译器推导出来为特化所表示的类型,走特化的
//顺口溜,有现成的,吃现成的。有符合要求的就不用编译器去按照模板去实例化一个对应的函数了。直接走已经实现好的,类模板相同。
cout << "int, int ababab" << endl;
}
int main()
{
func(2.0, 2.0);
func<float>(2.0, 2.0);
//func(1, 2.0);错误的,ps模板函数不允许自动类型转换,但普通函数可以进行自动类型转换
//,一个推出是int, 一个推出是double,冲突,除非你显示指定了(显示实例化)
func(1, 1);
return 0;
}
类模板:
// 注意:Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具
template<class T>
class Vector
{
public:
Vector(size_t capacity = 10)
:
_pData(new T[capacity])
, _size(0)
, _capacity(capacity)
{}
// 使用析构函数演示:在类中声明,在类外定义。
~Vector();
void PushBack(const T& data);
void PopBack();
// ...
size_t Size() { return _size; }
T& operator[](size_t pos)
{
assert(pos < _size);
return _pData[pos];
}
private:
T* _pData;
size_t _size;
size_t _capacity;
};
// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表
template <class T>
Vector<T>::~Vector()
{
if (_pData)
delete[] _pData;
_size = _capacity = 0;
}
类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<> 中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。
// Vector类名,Vector<int>才是类型 Vector<int> s1; Vector<double> s2;