函数模板的特例化(专用化)以及类型含有const的特殊情况
一.函数模板特例化:
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.定义 建立一个通用函数,它所用到的数据的类型(包括返回值类型.形参类型.局部变量类型)可以不具体指定,而是用一个虚拟的类型来代替(实际上是用一个标识符来占位),等发生函数调用时再根据 ...
- 【深入理解C++】函数模板和类模板的特例化
文章目录 1.函数模板的特例化 1.1 函数模板的全特化 1.2 函数模板不能偏特化 1.3 函数模板.函数模板的全特化.普通函数 2.类模板的特例化 2.1 类模板的全特化 2.2 类模板成员函数的 ...
- C++笔记7:C++提高编程1:模板—[函数模板和类模板]
0820 C++提高编程: 1.模板-[函数模板和类模板] 2.初识STL 3.STL-常用容器 4.STL-函数对象 5.STL-常用算法 C++提高编程引言: C++除了面向对象编程思想,还有泛型 ...
- 模板 (函数模板语法 ,类模板与函数模板的区别,:函数模板案例,普通函数与函数模板的区别,普通函数与函数模板调用规则,模板的局限性,类模板分文件编写.cpp,Person.hpp,类模板与友元)
**01:函数模板语法: #include<iostream> using namespace std;//交换两个整型函数 void swapInt(int &a ,int &a ...
- C++编程——函数模板
文章目录 1 函数模板语法 2 函数模板注意事项 3 函模模板案例 4 普通函数与函数模板的区别 5 普通函数与函数模板的调用规则 6 模板的局限性 模板就是建立通用的模具,大大提高复用性 模板的特点 ...
- [转]C++函数模板与模板函数
1.函数模板的声明和模板函数的生成 1.1函数模板的声明 函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计.它的最大特点是把函数使用的数据类型作为参数. 函数模板 ...
- 普通函数与函数模板的区别
普通函数与函数模板区别: 普通函数调用时可以发生自动类型转换(隐式类型转换) 函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换 如果利用显示指定类型的方式,可以发生隐式类型转换 #inclu ...
- c++ 函数模板_C/C++编程笔记:C++入门知识,深入解析C++函数和函数模板
本篇要学习的内容和知识结构概览 函数的参数及其传递方式 1. 函数参数传递方式 传值: 传变量值: 将实参内存中的内容拷贝一份给形参, 两者是不同的两块内存 传地址值: 将实参所对应的内存空间的地址值 ...
- 【C++深度剖析教程36】深入理解函数模板
加qq1126137994 微信:liu1126137994 一起学习更多技术!!! 1.函数模板深入理解 编译器从函数模板通过具体类型产生不同的函数 编译器会对函数模板进行两次编译 *对模板进行编译 ...
最新文章
- 认真推荐8个功能强大的实用网站,备受好评!
- 使用swoole编写简单的echo服务器
- jQuery基础---filter()和find()
- Exp7 网络欺诈防范 20155113徐步桥
- Android 计算器
- LazyT 提供对延迟初始化的支持
- maven(5)坐标和依赖
- Codeforces Round #307 (Div. 2) A. GukiZ and Contest 水题
- poj3276 反转 挑战程序设计竞赛
- 【转】struts1的struts-config.xml的配置说明
- opencv已知相机投影及内参求外参_一步步用c++实现相机标定(张氏标定法)
- android内存测试方法,Android内存测试方法.doc
- matlab中lambertw,MATLAB解常微分方程
- ssh工具连接虚拟机(finalshell)
- win time 修复服务器,Windows time 1058错误 修复
- Android 引入高德地图 SDK
- 当你同事工作出色时,如何得体地告知他上司
- 网站向bing搜索提交URL
- HTML+CSS+JS—时尚服装购物商城(1页) 大学生服装购物商城网页作品 服装网页设计作业模板 学生网页制作源代码下载
- java.sql.Date和java.sql.Timestamp转换
热门文章
- python解一元二次方程
- 【转载】音频基础知识
- 大一寒假集训(11)(12)---map,set
- 智慧农业: STM32F103ZE+ESP8266+腾讯云物联网平台+微信小程序设计
- Laya和TypeScript制作H5——开始
- 元旦经典文案素材赏析
- 搜索已配对蓝牙 java,java-查找和配对蓝牙设备
- 计算机二级两个控件之间求偶,求,全国计算机等级考试二级java历年试题及答案合集,还有上机考试真题?...
- 关于Android证书MD5获取
- 【自学51单片机】3 -- 硬件基础知识(电容、三极管、74HC245、74HC138三八译码器)介绍和闪烁LED小灯