一.函数模板特例化:

  1 #include <iostream>                                                                                                   2 #include <typeinfo>3 using namespace std;4 5 template <typename T,typename T>6 bool compare(T a,T b)7 {8     cout<<typeid(T).name()<<endl;9     cout<<typeid(a).name()<<endl;10     cout<<typeid(b).name()<<endl;11     return a > b;12 }13 14 int main()15 {16     compare<int>(100,220);17     compare<char*>("hello","world");18     return 0;19 }

分析这段代码前,说一个C或者C++一个比较奇怪的现象:

char *p = "helloworld";
左边:char*
右边:const char*把一个const属性的字符串交给一个普通的指针,这是十分危险的,为什么C/C++可以这样哦!这是因为以前很多很多的开发者都有这样code习惯,所以为了兼容以前,就把这种"恶习"保留了下来

模板的特例化:
由于某些类型的特殊性,函数模板实例化后的模板函数对于的代码,已经在逻辑上不成立了.
所以,这个时候需要我们开发人员针对这一类型专门的重写这个方法.

对于 compare<char*>("hello","world");
实例化以后产生的代码如下,考虑一下我们比较字符串时可以这样比较吗?
bool compare(char *a,char * b){cout<<typeid(char*).name()<<endl;cout<<typeid(a).name()<<endl;cout<<typeid(b).name()<<endl;return a > b;}
比较字符串我们一般使用类似于strcmp(),所以,编译器实例化的函数从逻辑上是站不住脚的.

如何书写一个函数模板特例化:

template<>
bool compare<char*>(char*a,char*b)
{return strcmp(a,b)>0?true:false;
}

你要觉得int类型的函数不满意,那我们也可以去提供一个int类型的特例化版本:

template<>
bool compare<int>(int a,int b)
{return a>b;
}

查找顺序:
编译器在编译的时候首先会找有没有针对某一类型的特例化版本;
如果没有找到,那么就会根据模板自己去实例化一份代码.

二.类型含有const的特殊情况:

  1 #include<iostream>2 #include<typeinfo>3 #include<string.h>4 using namespace std;5 6 template<typename T>7 bool com(T a,T b)8 {9     cout<<"type(T): "<<typeid(T).name()<<endl;                                                                        10     cout<<"type(a): "<<typeid(a).name()<<endl;11     cout<<"type(b): "<<typeid(b).name()<<endl;12     return a > b;13 }14 15 template<>16 bool com<const int>(const int a,const int b)17 {18     cout<<"template<>:const int"<<endl;19     return a>b;20 }21 22 template<>23 bool com<const char *>(const char*a,const char*b)24 {25     cout<<"template<>:const char*"<<endl;26     return strcmp(a,b) > 0 ? true:false;27 }28 int main()29 {30     int a =10;31     int b =11;32     com(a,b);                                                                                                         33     return 0;34 }   对于const int的特例化函数对应的函数名字的字符串大致为: " com_const_int"但是在实例化点 它想要的函数名是个"com_int"这样一比对,名字对不上号,所以就不会调用该类型的特例化版本,就会自己去生成一份代码
(尽管说int和const int对于编译器来说类型是相同的,但是组成函数名还是有影响的,'
尽管类型看似一样,生成的函数名不同,那么期望的函数与实际存在的特例化函数名就对不上号)

补充:

  • 对于函数模板,只支持模板的完全特例化,不支持模板的部分特例化,只有类模板支持模板的部分特例化;

函数模板的特例化(专用化)以及类型含有const的特殊情况相关推荐

  1. 类和函数模板以及特例化

    一.函数模板 1.定义 建立一个通用函数,它所用到的数据的类型(包括返回值类型.形参类型.局部变量类型)可以不具体指定,而是用一个虚拟的类型来代替(实际上是用一个标识符来占位),等发生函数调用时再根据 ...

  2. 【深入理解C++】函数模板和类模板的特例化

    文章目录 1.函数模板的特例化 1.1 函数模板的全特化 1.2 函数模板不能偏特化 1.3 函数模板.函数模板的全特化.普通函数 2.类模板的特例化 2.1 类模板的全特化 2.2 类模板成员函数的 ...

  3. C++笔记7:C++提高编程1:模板—[函数模板和类模板]

    0820 C++提高编程: 1.模板-[函数模板和类模板] 2.初识STL 3.STL-常用容器 4.STL-函数对象 5.STL-常用算法 C++提高编程引言: C++除了面向对象编程思想,还有泛型 ...

  4. 模板 (函数模板语法 ,类模板与函数模板的区别,:函数模板案例,普通函数与函数模板的区别,普通函数与函数模板调用规则,模板的局限性,类模板分文件编写.cpp,Person.hpp,类模板与友元)

    **01:函数模板语法: #include<iostream> using namespace std;//交换两个整型函数 void swapInt(int &a ,int &a ...

  5. C++编程——函数模板

    文章目录 1 函数模板语法 2 函数模板注意事项 3 函模模板案例 4 普通函数与函数模板的区别 5 普通函数与函数模板的调用规则 6 模板的局限性 模板就是建立通用的模具,大大提高复用性 模板的特点 ...

  6. [转]C++函数模板与模板函数

    1.函数模板的声明和模板函数的生成 1.1函数模板的声明 函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计.它的最大特点是把函数使用的数据类型作为参数. 函数模板 ...

  7. 普通函数与函数模板的区别

    普通函数与函数模板区别: 普通函数调用时可以发生自动类型转换(隐式类型转换) 函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换 如果利用显示指定类型的方式,可以发生隐式类型转换 #inclu ...

  8. c++ 函数模板_C/C++编程笔记:C++入门知识,深入解析C++函数和函数模板

    本篇要学习的内容和知识结构概览 函数的参数及其传递方式 1. 函数参数传递方式 传值: 传变量值: 将实参内存中的内容拷贝一份给形参, 两者是不同的两块内存 传地址值: 将实参所对应的内存空间的地址值 ...

  9. 【C++深度剖析教程36】深入理解函数模板

    加qq1126137994 微信:liu1126137994 一起学习更多技术!!! 1.函数模板深入理解 编译器从函数模板通过具体类型产生不同的函数 编译器会对函数模板进行两次编译 *对模板进行编译 ...

最新文章

  1. 认真推荐8个功能强大的实用网站,备受好评!
  2. 使用swoole编写简单的echo服务器
  3. jQuery基础---filter()和find()
  4. Exp7 网络欺诈防范 20155113徐步桥
  5. Android 计算器
  6. LazyT 提供对延迟初始化的支持
  7. maven(5)坐标和依赖
  8. Codeforces Round #307 (Div. 2) A. GukiZ and Contest 水题
  9. poj3276 反转 挑战程序设计竞赛
  10. 【转】struts1的struts-config.xml的配置说明
  11. opencv已知相机投影及内参求外参_一步步用c++实现相机标定(张氏标定法)
  12. android内存测试方法,Android内存测试方法.doc
  13. matlab中lambertw,MATLAB解常微分方程
  14. ssh工具连接虚拟机(finalshell)
  15. win time 修复服务器,Windows time 1058错误 修复
  16. Android 引入高德地图 SDK
  17. 当你同事工作出色时,如何得体地告知他上司
  18. 网站向bing搜索提交URL
  19. HTML+CSS+JS—时尚服装购物商城(1页) 大学生服装购物商城网页作品 服装网页设计作业模板 学生网页制作源代码下载
  20. java.sql.Date和java.sql.Timestamp转换

热门文章

  1. python解一元二次方程
  2. 【转载】音频基础知识
  3. 大一寒假集训(11)(12)---map,set
  4. 智慧农业: STM32F103ZE+ESP8266+腾讯云物联网平台+微信小程序设计
  5. Laya和TypeScript制作H5——开始
  6. 元旦经典文案素材赏析
  7. 搜索已配对蓝牙 java,java-查找和配对蓝牙设备
  8. 计算机二级两个控件之间求偶,求,全国计算机等级考试二级java历年试题及答案合集,还有上机考试真题?...
  9. 关于Android证书MD5获取
  10. 【自学51单片机】3 -- 硬件基础知识(电容、三极管、74HC245、74HC138三八译码器)介绍和闪烁LED小灯