Cpp 中有两种模板:函数模板 和 类模板
他们都不能直接使用。使用时,必须对类型参数赋以具体的数据类型,才能得到可使用的模板函数和模板类(实例化)
函数模板
函数模板代表了一组函数的集合,不是一个实实在在的函数,不可以直接使用,编译系统也不为它产生任何可执行代码
cpp
#include <iostream>
using namespace std;
template <class T>
T Max(T a, T b)
{
return a > b? a : b;
}
int main()
{
cout << Max(10, 20) << endl;
cout << Max(20.5, 15.3) << endl;
cout << Max<int>(10, 20.5) << endl;
cout << Max<double>(10, 20.5) << endl;
return 0;
}
模板函数的重载
cpp
#include <iostream>
#include <cstring>
template <class T>
T Max(T a, T b)
{
return a > b? a : b;
}
char* Max(char* a, char* b)
{
return (std::strcmp(a, b) > 0? a : b);
}
int main()
{
std::cout << Max(5,6) << std::endl;
std::cout << Max("g", "s") << std::endl;
return 0;
}
类模板
类模板不是一个实实在在的类,是一组类的集合。
没有可执行的代码,使用时要实例化为模板类
类模板外定义成员函数定义最开始要有与类模板完全一致的前缀
类名后要有"类型参数表"
cpp
#include <iostream>
using namespace std;
template <class T1, class T2>
class Example
{
protected:
T1 x;
T2 y;
public:
Example(T1, T2);
void print() { cout << "x = " << x << ", y = " << y << endl; }
};
template <class T1, class T2>
Example<T1, T2>::Example(T1 a, T2 b)
{
x = a;
y = b;
}
int main()
{
Example<int,int> a(10,10);
Example<int,double> b(20,30.5);
Example<char,int> c('M',20);
a.print();
b.print();
c.print();
return 0;
}
程序实例
cpp
#include <iostream>
#include <cstring>
#include <iomanip>
const int SUM = 5;
template <typename T>
class Student
{
protected:
std::string ID;
std::string name;
T score;
public:
Student(std::string id="000", std::string na=" ", T sc=0)
{
ID = id;
name = na;
score = sc;
}
void Set(std::string ID, std::string name, T score)
{
this->ID = ID;
this->name = name;
this->score = score;
}
std::string GetID()
{
return ID;
}
std::string GetName()
{
return name;
}
T GetScore()
{
return score;
}
};
class Group
{
protected:
Student<int> st[SUM];
int sum;
public:
Group();
void Input();
void Output();
void SortByScore();
void SortByName();
};
Group::Group()
{
sum = SUM;
}
void Group::Input()
{
int i;
std::string id,na;
int sc;
for(i=0;i<sum;i++)
{
std::cout<<"Input ID: ";
std::cin>>id;
std::cout<<"Input name: ";
std::cin>>na;
std::cout<<"Input score: ";
std::cin>>sc;
st[i].Set(id,na,sc);
}
}
void Group::Output()
{
int i;
std::cout<<"\n学号 姓名 成绩"<<std::endl;
for(i=0;i<sum;i++)
{
std::cout<<std::setw(6)<<st[i].GetID()<<std::setw(6)<<st[i].GetName()<<std::setw(6)<<st[i].GetScore()<<std::endl;
}
}
void Group::SortByScore()
{
int i,j;
Student<int> temp;
for(i=0;i<sum-1;i++)
{
for(j=i+1;j<sum;j++)
{
if(st[i].GetScore()<st[j].GetScore())
{
temp = st[i];
st[i] = st[j];
st[j] = temp;
}
}
}
}
void Group::SortByName()
{
int i,j;
Student<int> temp;
for(i=0;i<sum-1;i++)
{
for(j=i+1;j<sum;j++)
{
if(strcmp(st[i].GetName().c_str(),st[j].GetName().c_str())>0)
{
temp = st[i];
st[i] = st[j];
st[j] = temp;
}
}
}
}
int main()
{
Group g;
g.Input();
g.Output();
g.SortByScore();
g.Output();
g.SortByName();
g.Output();
return 0;
}