c++模板与泛型编程

函数模板

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 函数该被绑定” (发生在运行期)之间的差异。

相关扩展:模板为什么不支持分离式编译

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值