目录
函数模板
javascript
template<typename T>
void swapAll(T& a, T& b)
{
T tmp = a;
a = b;
b = tmp;
return;
}
void demo1()
{
double da = 2.5;
double db = 2.3;
swapAll(da, db);
cout << "da : " << da << " db: " << db << endl;
int a = 10;
int b = 20;
swapAll(a, b);
cout << "a : " << a << " b:" << b<<endl;
}
如上面代码所示,首先 template<typename T> 这个模板的范围仅限于 void swapAll(T& a, T& b) 这个函数。
函数模板会编译两次,第一次是对模板本身编译,第二次,函数调用出,将T的类型具体化。
函数模板自动类型推导时,不能对函数的参数进行自动类型转换。
在实际使用中,可能会出现模板函数和非模板函数的重载,
所以我们换了一种写法来强制使用模板函数。
javascript
void demo2()
{
int a2 = 10;
int b2 = 20;
swapAll<int>(a2,b2);
double da2 = 1.1;
double db2 = 2.2;
swapAll<double>(da2, db2);
}
函数模板的局限性
当函数模板推导 T 为数组或者其他自定义类型数据,可能导致运算符不识别。
javascript
template<typename T>
void myPrintAll(T a)
{
cout<<a<<endl;
}
如上面代码所示,如果 T 是一个自定义类的类类型,代码执行可能会出问题,所以这种情况下就要在类里面编写重载运算符函数。
类模板
类模板,类模板实例化对象,不能自动类型推导(重要)
javascript
//类模板,类模板实例化对象,不能自动类型推导(重要)
template<class T1,class T2>
class Data
{
private:
T1 a;
T2 b;
public:
Data() {}
Data(T1 tmpa, T2 tmpb)
{
this->a = tmpa;
this->b = tmpb;
}
void showData()
{
cout << a << " " << b << endl;
}
};
void demo3()
{
Data<int, int> ob1(10,20);
ob1.showData();
Data<int, char> ob2(10,'A');
ob2.showData();
}
类模板的成员函数在类外实现
//类模板,类模板实例化对象,不能自动类型推导(重要)
javascript
template<class T1, class T2>
class Data
{
private:
T1 a;
T2 b;
public:
Data() {}
Data(T1 tmpa, T2 tmpb)
{
this->a = tmpa;
this->b = tmpb;
}
void showData();
};
template<class T1,class T2>
void Data<T1,T2>::showData()
{
cout << a << " " << b << endl;
}
模板类派生普通类
javascript
template<class T1,class T2>
class Base
{
private:
T1 a;
T2 b;
public:
Base(T1& tmpa, T2& tmpb)
{
this->a = tmpa;
this->b = tmpb;
}
void showData();
};
template<class T1,class T2>
void Base<T1, T2>::showData()
{
cout << a << endl;
cout << b << endl;
}
class Son1 :public Base<int, char>
{
public:
int c;
Son1(int a, char b, int c) :Base<int, char>(a, b) {
this->c = c;
}
};
void demo1113()
{
Son1 ob1(100, 'A', 200);
}
模板类派生模板类
javascript
template<class T1,class T2,class T3>
class Son2 :public Base<T1, T2>
{
public:
T3 c;
public:
Son2(T1 tmpa, T2 tmpb, T3 tmpc) : Base<T1, T2>(tmpa, tmpb)
{
this->c = tmpc;
}
};
void demo1113()
{
//Son1 ob1(100, 'A', 200);
Son2<int, string, double> ob2(1,"hello",2.3);
}