C++的模板如何隐藏实现

发布于 2021-09-25 09:23

嵌入式情报局
集单片机与linux于一身的技术号,深漂三年仍成功上岸研究生,这里不仅有技术还有故事,只为分享全面的嵌入式知识和深度的职场趣事,主要话题有:C/C++、数据结构与算法、MCU、嵌入式Linux 和物联网技术等,期待大家的持续!
137篇原创内容
大家好,我是情报小哥!
在前面文章中介绍模板的时候,有个伙计问到C++中的模板如何隐藏实现,在之前的文章中也跟大家介绍过了模板的基本原理,即在编译过程中进行模板类型的替换,需要模板的实现和使用基本上需要在一块,不然编译过程找不到定义,因此模板的定义和声明通常都写在同一个头文件中,为了区分定义与实现也把它们进行分离,分别写成.h和.hpp,不过这与把它们同时写在一个.h文件中效果是一样的,因为头文件编译过程中都是直接展开的。
然而由于商业上的一些限制,对外发布相关软件进行二次开发,一般都是以库的方式进行发布,即头文件和编译好的相应库文件。
而对于库文件其实都是由对应的源文件编译生成的目标文件(.o/.obj文件)的集合,即很多目标文件经过压缩打包后就形成了库文件。这样具体的实现就编译成了库,从而达到了隐藏具体实现的目的。
对于模板是一个替换以后再进行具体编译的过程,这与我们的宏定义机制是极其类似的,所以模板通常不能单独编译,而是写在对应的头文件中供参考使用,所以理论上根据模板的性质是无法实现相应信息隐藏的。
然而后面小哥又跟大家讲解了一下模板的特化,多参数特化有存在局部特化和全局特化,局部特化其实还是属于模板的性质。
但是全局特化就更多的是一种指定类型的重写函数,说得更加简单的一点就是直接显式指定类型,使得函数实现不再参数化,而这种情况就不需要全部定义在头文件中,可作为源文件而存在,这也就意味着可以独立编译成目标文件,并生成库了。
下面参考一下演示代码:

但是这样的特化在一定程度上牺牲了模板的灵活度。

最  后 


嵌入式情报局
集单片机与linux于一身的技术号,深漂三年仍成功上岸研究生,这里不仅有技术还有故事,只为分享全面的嵌入式知识和深度的职场趣事,主要话题有:C/C++、数据结构与算法、MCU、嵌入式Linux 和物联网技术等,期待大家的持续!
137篇原创内容

☞ 专辑|Linux应用程序编程大全

☞ 专辑|学点网络知识

☞ 专辑|手撕C语言

☞ 专辑|手撕C++语言

☞ 专辑|经验分享

☞ 专辑|从单片机到Linux

☞ 专辑|电能控制技术

本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。

相关素材