函数模板
template <typename T>
inline T const& Max (T const& a, T const& b)
{
return a < b ? b:a;
}
调用函数时,编译器会进行实参推到,由传入的参数推断类型T,不用手动输入。
类模板
template <class T> // class T 和 typename T 表示一个意思
class Stack {
private:
vector<T> elems; // 元素
public:
void push(T const&); // 入栈
void pop(); // 出栈
T top() const; // 返回栈顶元素
};
template <class T>
void Stack<T>::push (T const& elem)
{
elems.push_back(elem);
}
模板特化
上述类模板为泛化(generic)的类模板
,如果一个类模板对某个特定类型有特殊的处理方法时可以再为该类型写一个特化(specialization)的类模板
。
全特化模板:
template <>
class Stack<int>
{
…
};
当传入的类型参数为特化的参数类型时调用特化模板,为其他类型时调用泛化模板。
当类模板有多个类型参数时,对其中某个类型参数为特定类型有特殊处理方法时可以使用偏特化(partial speciaization)的类模板
//泛化:
template <class T ,class Alloc=alloc > //第二个模板参数带有默认值,意义和函数参数的默认值一样
class vector
{
…
};
偏特化:
template<class Alloc=alloc >
class vector<bool, Alloc>
{
…
};
泛型编程
Templates 及泛型编程的世界,与面向对象有根本上的不同。在此世界中显式接口和运行期多态仍然存在,但重要性降低。反倒是隐式接口(implicit interfaces)和编译期多态(compile-time polymorphism) 移到前头了。
”运行期多态”和“编译期多态”之间的差异,因为它类似于“哪一个重载函数该被调用”(发生在编译期)和“哪一个virtual 函数该被绑定” (发生在运行期)之间的差异。
相关扩展:模板为什么不支持分离式编译