Wednesday 6 February 2019

C++ Function Template

函数模板
泛型程序设计:Generic Programming
算法实现时不指定具体要操作的数据类型
泛型--算法实现一边->适用于多种数据结构
优势:减少重复代码的编写
大量编写模板,使用模板的程序设计:函数模板,类模板
交换两个变量值的函数模板:
template <class T>
void Swap(T&x, T&y) {
 T tmp = x;
 x = y;
 y = tmp;
}
int main() {
 int n = 1, m = 2;
 Swap(n, m);
 double f = 1.2, g = 2.3;
 Swap(f, g);
 return 0;
}
函数模板中可以有不止一个类型参数
template <class T1,class T2>
T2 print(T1 arg1, T2 arg2) {
 cout << arg1 << " " << arg2 << endl;
 return arg2;
}
函数模板可以重载,只要它们的形参表不用即可:
template <class T1,class T2>
void print(T1 arg1, T2 arg2)
{
 cout << arg1 << " " << arg2 << endl;
}
template<class T>
void print(T arg1, T arg2)
{
 cout << arg1 << " " << arg2 << endl;
}
C++编译器遵循一下优先顺序:
  1. 先找参数完全匹配的普通函数(非由模板实例化而得的函数)
  2. 再找参数完全匹配的模板函数
  3. 再找实参经过自动类型转换后能够匹配的普通函数
  4. 上面的都找不到,则报错
template <class T>
T Max(T a, T b)
{
 cout << "Template Max 1" << endl
  ;
 return 0;
}
template <class T, class T2>
T Max(T a, T2 b)
{
 cout << "Template Max 2" << endl
  ;
 return 0;
}
double Max(double a, double b) {
 cout << "MyMax" << endl;
 return 0;
}
int main()
{
 int i = 4, j = 5;
 Max(1.2, 3.4); //调用Max(double, double)函数
 Max(i, j); //调用第一个T Max(T a, T b)模板生成的函数
 Max(1.2, 3); //调用第二个T Max(T a, T2 b)模板生成的函数
 return 0;
}
为了避免函数的二义性:可以在函数模板中使用多个类型参数,可以避免二义性

No comments:

Post a Comment