C++中的模板一般有函数模板和类模板。
函数模板并不会创建任何函数,只会告诉编译器如何定义。如需要int型的转换时,用int替换AnyType即可
template <typename AnyType> //表示要建立一个名Anytype的函数模板,其中template和typename为关键字。
//其中typename可以替换为class
void Swap(AnyType &a ,Antype &b)
{
AnyType temp;
temp = a;
a = b;
b = temp;
}
类模板:
/*作用:
使用模板的目的是让程序员写出与类型无关的代码
比如写了一个交换两个整型int的swap函数,如果要交换其他类型的如
double、char类型的swap就要重新编写一个函数。
使用模板可以让程序与类型无关。如swap模板函数,可以实现int型,也可以实现double。
模板可以用于函数和类。
模板声明和定义只能在全局,命名空间或类的范围内进行。
也就是不能在局部范围内,函数内进行,如不能在main函数中声明定义一个模板
*/
//基本的用法如下:
#include<cstring>
#include<typeinfo>
#include<iostream>
using namespace std;
//整型
class A{
private:
int m_x;
int m_y;
public:
A(int x, int y) :m_x(x), m_y(y){
}
int compare(void){
cout << "Type of n_x is" << typeid (m_x).name() << endl;
cout << "Type of n_x is" << typeid (m_y).name() << endl;
if (m_x < m_y)
return -1;
if (m_x>m_y)
return -1;
return 0;
}
};
//双精度
class B{
private:
double m_x;
double m_y;
public:
B(double x, double y) :m_x(x), m_y(y){
}
int compare(void){
cout << "type of m_x is" << typeid (m_x).name() << endl;
cout << "type of m_x is" << typeid (m_y).name() << endl;
if (m_x < m_y)
return -1;
if (m_x>m_y)
return -1;
return 0;
}
};
//字符串
class C{
private:
string m_x;
string m_y;
public:
C(string x, string y) :m_x(x), m_y(y){
}
int compare(void){
cout << "type of m_x is" << typeid (m_x).name() << endl;
cout << "type of m_x is" << typeid (m_y).name() << endl;
if (m_x < m_y)
return -1;
if (m_x > m_y)
return -1;
return 0;
}
};
//类模板
template<class T> class D
{
private:
T m_x;
T m_y;
public:
D(T x, T y) :m_x(x), m_y(y){
}
int compare(void){
cout << "type of m_x is" << typeid (m_x).name() << endl;
cout << "type of m_x is" << typeid (m_y).name() << endl;
if (m_x < m_y)
return -1;
if (m_x > m_y)
return -1;
return 0;
}
};
//针对char*的类模板成员函数特化
template<>
int D<char*>::compare (void)
{
cout << "type of m_x is" << typeid (m_x).name() << endl;
cout << "type of m_x is" << typeid (m_y).name() << endl;
if (strcmp(m_x, m_y)<0)
return -1;
if (strcmp(m_x, m_y)>0)
return -1;
return 0;
}
//函数模板
template<class T>
int compare(T x, T y)
{
cout << "type of m_x is" << typeid (x).name() << endl;
cout << "type of m_x is" << typeid (y).name() << endl;
if (x<y)
return -1;
if (x>y)
return -1;
return 0;
}
//针对char*的函数模板特化
template<>
int compare<char *>(char* x,char* y)
{
cout << "type of m_x is" << typeid (x).name() << endl;
cout << "type of m_x is" << typeid (y).name() << endl;
if (strcmp(x,y)<0)
return -1;
if (strcmp(x,y)>0)
return -1;
return 0;
}
//测试程序
int main(int argc, char* argv[]){
//不用模板
cout << "不用模板" << endl;
A a(10, 20);
cout << "A:: compare() return" << a.compare() << endl;
B b(0.1, 0.2);
cout << "B:: compare() return" << b.compare() << endl;
C c("coursge", "excellent");
cout << "C:: compare() return" << c.compare() << endl;
cout << "_______________________________________" << endl;
cout << "用类模板" << endl;
D<int> d1(10, 20);
cout << "D<int>:: compare() return " << d1.compare()<<endl;
D<double>d2(0.1, 0.2);
cout << "D<double>:: compare() return " << d1.compare() << endl;
D <string>d3("courgae", "excellent");
cout<<"D<string>::compare() return " << d1.compare()<<endl;
cout << "_______________________________________" << endl;
cout << "类模板及成员函数的特化" << endl;
char sz1[] = "courage";
char sz2[] = "excellent";
D<char*> d4(sz1, sz2);
cout << "D<char*>::compare() return " << d4.compare() << endl;
cout << "____________________________________" << endl;
//函数模板及其特化
cout << "compare<int>() return " << compare<int>(10, 20) << endl;
cout << "compare<double>() return " << compare<double>(0.1, 0.2) << endl;
cout << "compare<string>() return " << compare<string>("courage", "excellent") << endl;
cout << "compare<char*>() return " << compare<char*>(sz1, sz2) << endl;
cout << "________________________________" << endl;
//函数模板的隐士推断
cout << "compare() retrun" << compare(10, 20) << endl;
cout << "compare() retrun" << compare(0.1, 0.2) << endl;
cout << "compare() retrun" << compare(string("courage"),string("excellent")) << endl;
cout << "compare() retrun" << compare(sz1,sz2) << endl;
return 0;
}