1.模板参数加入一个变量
一般只能是int,double要看c++的版本,在最新的版本下是支持double模板参数的。
2.适配器的使用
template <class T,class container=deque<T>>
class stack {
public:void push_back(const T& x) {_con.push_back(x);}void pop() {_con.pop_back();}size_t size() {return _con.size();}bool empty() {return _con.empty();}const T& top() {return _con.back();}
private:container _con;
};
上面的代码是用双端队列deque这个适配器构造一个栈。(这是一种车有轮胎的复用常用的复用关系,与c++中继承对应的植物中的番茄那种复用是不同的)所谓适配器,实际上就是把之前搞定的东西通过转化后直接用来创建新东西。
3.固定指针和引用的模板
template <class T1&,class T2*>
通过这种方式进行固定指针和引用类型参数。
4.特化与偏特化
4.1原函数模板:
template <class Type>
Type Max(const Type& a, const Type& b)
{cout << "This is Max<Type>" << endl;return a > b ? a : b;
}
template <class Type1,class Type2>
Type1 a(Type1 aa1, Type2 aa2) {return aa1 + aa2;
}
4.2特化:
template<>
int Max<int>(const int& a, const int& b)
{cout << "This is Max<int>" << endl;return a > b ? a : b;
}
通过这个代码可以对函数模板中int类型的函数模板进行(特化)也就是规定int型的函数会生成这个。
4.3偏特化:
template <class Type1>
Type1 a<Type1,int>(Type1 aa1, int aa2) {return aa1 + aa2;
}
偏特化限制了部分的位置,偏特化进行实例化的优先级是大于全部都是模板参数的。
5.仿函数
简单介绍一下仿函数,实际上就是创建一个类,然后用类的一些方法做到类似函数的效果。例如下面这个代码:
template<class T>
class less{
public:bool operator() (const T& x, const T& y) {return x > y;}
};
int main() {less<int> ls;bool rt = ls(3, 4);
}
为什么要使用仿函数?当在要进行建大堆和建小堆的情况下,每次都需要改里面的大于和小于号?那不是很麻烦吗?但是如果在模板中加入一个仿函数对象,就能直接进行处理!