1、函数模板
1.1、template<typename T>
T max(T a, T b)
{
return a < b ? b :a;
}
用法int iMax = max(1, 3);
1,3能够自动匹配到int上
也可以强制指定类型
int iMax = max<int>(1,2, 3,1);
虽然1.2应该匹配到float上,但是T指定了int,max中的T也会被实例化为int类型
1.2、函数模板的重载
template <typename T>
T max(T a, T b, T c)
{
return ::max(::max(a, b), c);
}
1.3 如果标准库也有max,如何让编译器调用模板的呢?
max<>(1,3)这样表示调用模板里面的函数
2、类模板
2.1 template<typename T1, typename T2>
class Stack
{
public:
void Push(const T&);
private:
vector<T> vsElems;}
函数定义方式
template<typename T>
void Stack<T>::Push(const T& elem)
{
vsElems.push_back(elem);
}
2.2 类模板的特例化
template<>
class Stack<int, int>
{
特例化接口实现,当T类型为int时会到这个接口中。。。
}
2.3 局部特例化
teplate<typename T>
class Stack<T, T>
{
当两个类型相同时的特例化
}
template<typename T>
class Stack<T, int>
{
// 当第二个类型为int时的特例化
}
2.4 缺省模板实参(函数模板不能设置缺省模板参数)
template<typename T1, typename T2 = int>
class Stack
{}
2.5 非类型的模板参数,即模板参数不是int,class这种类型
template<typename T1, int iMax = 10>
class Stack
{
// 可以将iMax当做常数来使用
private:
T1 iArray[iMax];
}
使用Stack<int, 20>,指定iMax为20
2.5 模板参数可以依赖于模板参数
template<typename T1, typename T2 = vector<T1> >
3、技巧性基础知识
3.1 访问模板参数里面的类型时,前面要加typename
template<typename T>
class MyClass
{
public:
typename T::subType * ptr; // subType为T里面的一个类型,不是成员变量哦,比如vector<int>中的iterator这种
}
3.2 成员模板
template<typename T>
class MyClass
{
public:
template<typename T2>
MyClass<T>& operator = (MyClass<T2> const&);
}
3.3 模板的模板参数
template<typename T1, template<typename T2> class CONT>