模板的进阶

一.非类型模板参数

可用来定义常量。定死参数是什么类型,发生**改变的只是参数的值。**支持缺省值。

注:使用缺省值要这么干:

宏和非类型模板参数的区别

如果N是一个宏,那么它只能被定义为一个数,无法在使用时(main函数里)再做变更。而如果N是一个非类型的模板,那么就可以在使用时灵活改变大小。

定死的类型仅限整型(char,int,long,bool,size_t...),double之类的都不可以,自定义类型更不可以。

二.特化

1.函数模板的特化

对函数模板某一特定类型进行具体化。其余类型正常照类模板走。

恕作者实在能力有限,特化着实用起来麻烦,各种const加的混头晕脑,还是利用特定类型实例化一个函数模板来的畅快。

函数特化要谨慎使用!!

2.类模板的特化

①.全特化

②.偏特化/半特化

③.针对指针的偏特化

④.针对引用的偏特化

特化也有惰性,能全特化绝不偏特化。

三.模板声明定义分离会出错的原因

回顾一下编译链接的过程:

解释原因

假设项目由三个文件构成:

Func.cpp,test.cpp,Func.h

两个cpp文件均包含了.h文件

test里有测试用例(实参)

函数模板声明在.h中,定义在Func.cpp中。

模板的实例化发生在编译阶段,随后进入汇编阶段时,会在符号表里生成实例化的函数的地址。最后进入链接阶段,会把上面这个地址链接上。(当然,以上是基于声明和定义在同一文件内的)

如果声明和定义分离到两个文件里,那么负责实例化的定义代码和只负责插个眼的声明代码就在不同文件中。由于test包含了.h,此时就单单一个声明代码进入编译链接的过程,那么这样是没法实例化的。既然没有实例化的定义代码,模板就没法实例化成具体的函数。那么进入汇编阶段时,没有实例化的函数,符号表就没法生成对应的函数地址。

没地址,就没法链接。

为何.cpp文件明明包含.h文件,那代码最后不是声明和定义不就会链接整合到一块了吗,那这个时候不就有实例化的代码了吗?

得注意, 即便包含了, 在最后一步链接之前,整个项目不同文件依旧是独立的。而实例化恰恰就在链接前的编译阶段。

相关推荐
东东最爱敲键盘17 分钟前
day9.C++多态之虚函数
开发语言·c++
Darkwanderor31 分钟前
Linux线程控制
linux·c语言·c++
Darkwanderor1 小时前
多线程的互斥问题和互斥锁解决互斥问题
linux·c语言·c++
键盘会跳舞1 小时前
C++:std::pair 源码级深度剖析 —— 关联容器的基石
开发语言·c++·pair·关联容器
(Charon)1 小时前
【C++】手写线程安全队列:mutex + condition_variable 实现生产者消费者模型
c语言·开发语言·c++
·薯条大王10 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
hansang_IR15 小时前
【题解】LC:倍增 / 区间并查集(Range Parallel Unionfind)
c++·算法·并查集
东东最爱敲键盘15 小时前
day7.c++继承
c++
沫璃染墨16 小时前
《从零入门Linux系统篇(十五):系统工具篇·六——GDB调试器详解:从程序执行控制到高级调试技巧》
linux·运维·服务器·c语言·c++
吃着火锅x唱着歌16 小时前
Effective C++ 学习笔记 条款40 明智而审慎地使用多重继承
c++·笔记·学习