C++中提供了两种模板机制,分别是函数模板和类模板。下面介绍这两种类型。
函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称函数模板。凡是函数体相同的函数都可用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参类型来取代模板中的虚拟内型,从而实现不同函数功能的调用。
#include <iostream>
using namespace std;
int add(int x,int y) // 普通函数
{
cout << "int add(int x,int y)" << endl;
return (x + y);
}
template <typename T> // 模板函数
T add(T x,T y)
{
cout << "T add(T x,T y)" << endl;//当普通函数与模板函数同名时,优先调用普通函数
return (x + y);
}
int main()
{
add(1,2);
return 0;
}
template <typename T> 只能定义以下一个函数
普通函数有默认类型转换,但是函数模板没有类型转换
#include <iostream>
using namespace std;
void print(int x,int y)
{
cout << "x = " << x << " y= " << y << endl;
}
template<typename T> //只能作用于以下一个函数,如果要写一个模板函数,必须写template
void print1(T x,T y)
{
cout << "x = " << x << " y= " << y << endl;
}
int main()
{
print(1,'a'); //普通函数有类型转换
//print1(98,'b'); // 模板函数没有类型转换
return 0;
}
模板函数调用时有隐式调用和显示调用。
#include <iostream>
using namespace std;
template <typename T>
void print(T a,T b)
{
cout << "a = " << a << " b = " << b << endl;
}
int main()
{
print(1,2); // 隐式调用
print<int>(97,'c'); // 显示调用
return 0;
}
类模板,使程序(算法)可以使逻辑上抽象,把处理的对象类型作为参数传递,凡是类体内的对象相同时可用这个类模板来代替,不必重复定义多个类。
#include<iostream>
#include<cstring>
using namespace std;
template <typename T> // 模板类
class Parent
{
protected:
T m_a;
public:
Parent(T a)
{
m_a = a;
}
};
/*class Child:public Parent<int> //模板类派生出一个普通类
{
private:
int m_b;
public:
Child(int a,int b):Parent<int>(a)
{
m_b = b;
}
void show()
{
cout << m_a << " " << m_b << endl;
}
};
*/
template <typename T1,typename T2> //模板类派生出模板
class Student:public Parent<T1>
{
private:
T2 m_b;
public:
Student(T1 a,T2 b):Parent<T1>(a)
{
m_b = b;
}
void show()
{
cout << Parent<T1>::m_a << " " << m_b << endl; //因为二次编译,不加限定符,无法确定是哪个m_a;
}
};
int main()
{
//Child c(1,2);
//c.show();
Student<int,char> b(10,'a');
b.show();
return 0;
}
类模板需要重载时需要重新定义一个模板看类。
#include<iostream>
using namespace std;
template <typename T1>
void myswap(T1& x,T1& y)
{
T1 tmp;
tmp = x;
x = y;
y = tmp;
}
template <typename T1,typename T2> //函数模板重载,需重新定义一个模板类
void myswap(T1& x,T2& y)
{
T1 tmp;
tmp = x;
x = y;
y = tmp;
cout << "x = " << x << " y = " << y << endl;
}
int main()
{
int a = 1,b = 3;
myswap(a,b); //隐式调用
cout << "a = " << a << " b= " << b << endl;
double x = 1.11,y = 2.22;
myswap(x,y);
cout << "x= " << x << " y= " << y << endl;
char c = 'd';
double e = 99;
int d = 97;
myswap<int,char>(d,c); //显示调用
return 0;
}