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