函数模板特化

4.模板特化
有些时候,我们编写的模板定义并不总是适用于所有类型

template<typename T>
int compare(const T&v1,const T&v2)
{
    if(v1<v2)return -1;
    if(v1>v2)return 1;
    return 0;
}

当这个函数的参数类型是C风格字符串时,这个函数不能正常工作(这个函数将比较两个指针在内存中的相对位置,但没有比较指针指向对象的大小),这时候我们必须提供一个针对C风格字符串的特殊定义,这就是模板特化

1.函数模板的特化
特化的形式如下:

关键字tempalte后面接一对空的尖括号(< >)
函数名后接模板名和一对尖括号,尖括号中指定这个特化定义的模板形参
函数形参表
函数体
template<>
int compare<const char *>(const char *const &v1,const char *const &v2)
{
    return strcmp(v1,v2);
}

1.声明模板特化
与任意函数一样,函数模板特化可以声明而无须定义。

template<>
int compare<const char *>(const char *const &,const char *const &);

2.函数重载与模板特化
如果在特化中省略空的模板形参表template<>,那么结果是函数的重载而不是模板特化

int compare(const char *const&,const char *const&);
//声明了该函数的重载版本而不是模板版本

3.特化的作用域规则
在调用模板的这个特化版本之前,特化的声明必须在作用域中

template<class T>
int compare(const T&t1,const T& t2)
{
    ...
}
 
int main()
{
    int i=compare("hello","world");
    ...
}
 
template<>
int compare<const char *>(const char *const &s1,const char *const &s2)
{
    ...
}

这个程序有错误,这个函数将会调用未特化的原模板函数

特化出现在对该模板实例的调用之后是错误的
————————————————
版权声明:本文为CSDN博主「Gamer_code」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_52902391/article/details/120614881

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文的标题改为陈述句可能更合适:为什么不该特化函数模板。 重载 v.s. 特化 为了更好的理解,我们先快速地回顾一...
    suesai阅读 6,828评论 0 0
  • 函数模板示例 最简单的例子如下。使用作用域运算符(::)表示指定使用全局命名空间中的 max 模板,而非 std:...
    奇点创客阅读 1,033评论 0 0
  • 一、为什么要有函数模板 在泛型编程出现前,我们要实现一个swap函数得这样写: 但这个函数只支持int型的变量交换...
    许了阅读 12,724评论 1 5
  • 总结下c++模板相关的基础知识,便于查阅。 模板: 模板定义以关键字template开始,后跟一个模板参数列表,这...
    码农练功房阅读 2,325评论 0 1
  • 1、函数模板举例 函数模板支持重载,例子中Swap(a, b)和Swap(c, d, 10)调用的函数模板就不一样...
    钟离惜阅读 3,471评论 0 0