C++模板的特化详解(函数模版特殊,类模版特化)

本文详细介绍了C++中的模板特化,包括函数模板和类模板的特化概念、分类、全特化与偏特化。通过示例程序阐述了如何进行函数模板的特化,以及类模板的特化,如特化为绝对类型、引用和指针类型,并给出了实际应用案例。
摘要由CSDN通过智能技术生成
                       
 

代码上传至

   

https://github.com/gatieme/AderXCoding/tree/master/language/cpp/template_special

   

或者

   

https://github.com/gatieme/STLSourceAnalysis/tree/master/stl-gatieme/3-iterator 下的3templatespecial_class.cpp和3templatespecial_func.cpp

   

参照

   

小解C++模板特化

   

C++模板的特化

   

模板的全特化与偏特化

模版与特化的概念


函数模版与类模版


C++中模板分为函数模板和类模板

  • 函数模板:是一种抽象函数定义,它代表一类同构函数。

  • 类模板:是一种更高层次的抽象的类定义。

特化的概念


所谓特化,就是将泛型的东东搞得具体化一些,从字面上来解释,就是为已有的模板参数进行一些使其特殊化的指定,使得以前不受任何约束的模板参数,或受到特定的修饰(例如const或者摇身一变成为了指针之类的东东,甚至是经过别的模板类包装之后的模板类型)或完全被指定了下来。

模板特化的分类


针对特化的对象不同,分为两类:函数模板的特化类模板的特化

  • 函数模板的特化

    当函数模板需要对某些类型进行特化处理,称为函数模板的特化。

  • 类模板的特化

    当类模板内需要对某些类型进行特别处理时,使用类模板的特化。

特化整体上分为全特化偏特化
*   全特化

就是模板中模板参数全被指定为确定的类型。全特化也就是定义了一个全新的类型,全特化的类中的函数可以与模板类不一样。
  
  
  
  • 1
  • 2
  • 3
  • 偏特化

    就是模板中的模板参数没有被全部确定,需要编译器在编译时进行确定。

 

全特化的标志就是产生出完全确定的东西,而不是还需要在编译期间去搜寻适合的特化实现,貌似在我的这种理解下,全特化的 东西不论是类还是函数都有这样的特点,

  1. 模板函数只能全特化,没有偏特化(以后可能有)。

  2. 模板类是可以全特化和偏特化的。

 

template <>然后是完全和模板类型没有一点关系的类实现或者函数定义,如果你要说,都完全确定下来了,那还搞什么模板呀,直接定义不就完事了?

   

但是很多时候,我们既需要一个模板能应对各种情形,又需要它对于某个特定的类型(比如bool)有着特别的处理,这种情形下特化就是需要的了。

  • 全特化的标志:template <>然后是完全和模板类型没有一点关系的类实现或者函数定义
  • 偏特化的标志:template

函数模版特化


目前的标准中,模板函数只能全特化,没有偏特化

 

至于为什么函数不能偏特化,似乎不是因为语言实现不了,而是因为偏特化的功能可以通过函数的重载完成。

函数模版的特化技巧


函数模板的特化:当函数模板需要对某些类型进行特别处理,称为函数模板的特化。

例如,我们编写了一个泛化的比较程序

template <class T>int compare(const T &left, const T&right){    std::cout <<"in template<class T>..." <<std::endl;    return (left - right);}
  
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这个函数满足我们的需求了么,显然不,它支持常见int, float等类型的数据的比较,但是不支持char*(string)类型。

所以我们必须对其进行特化,以让它支持两个字符串的比较,因此我们实现了如下的特化函数。

template < >int compare<const char*>(const char* left, const char* right){    std::cout <<"in special template< >..." <<std::endl;    return strcmp(left, right);}
  
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

也可以

template < >int compare(const char* left, const char* right){    std::cout <<"in special template< >..." <<std::endl;    return 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值