//第一个例子,函数模板,模板的重载,模板中的参数不会进行
//隐式类型转化
template <typename T>
T const &max(T const &a,T const &b)
{
return a >b ? a:b;
}
//下面定义一个重载版本,编译器会优先调用非重载的版本
int const &max(int const a, int const &b)
{
return a>b?a:b;
}
//第二个例子,类的模板
template <typename T>
class firstTemplate
{
public:
firstTemplate(T xa, T xb):a(xa),b(xb)
{
}
void foo()
{
cout << (this->a+this->b);
}
private:
T a;
T b;
};
//模板的特化,为了让某个类更好的适应某一类型,特化时可以增加成员变量已经成员函数
template<>
class firstTemplate<int>
{
public:
firstTemplate(int xa, int xb):a(xa),b(xb)
{
c = int();//0初始化,防止没有初始化
}
void foo()
{
cout << (this->a+this->b+this->c);
}
private:
int a;
int b;
int c;
};
//局部特化
template<typename T,typename T2>
T addvalue(T a, T2 b)
{
cout << "hehe1";
return a+b;
}
template<typename T>
int addvalue(T a,T b)
{
cout << "hehe2";
return a+50;
}
//缺省模板实参
template<typename T1,typename T2 = int>
void foo(T1 a, T2 b)
{
cout << typeid(a).name()<< typeid(b).name();
}
//非类型模板参数
template<typename T,int value>
T subvalue(T const &a)
{
return a-value;
}