news 2026/6/15 11:34:23

C++编程实践——模板的显式实例化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++编程实践——模板的显式实例化

一、说明

模板的显式实例化,explicit instantiation,也叫全实例化。所谓显式实例化,就是开发者为模板代码(模板函数或类)手动编写指定类型的代码。类似下面的代码:

template<typename T>TDemo(T a){returna;}templateintDemo<int>(int);template std::string Demo<std::string>(std::string);

大家一定要把显式实例化和全特化区分出来,一个最简单的方法是,显式实例化的template后不再跟着模板尖括号“<>”,而所有的模板和特化(不管是偏特化和全特化)都是要有的。看一下全特化的情况:

template<typename T>TDemo(T a){returna;}template<>intDemo(inta){returna;}

也可以理解为全实例化只需声明不用自写实现而全特化需要自己实现相关的代码。当然,模板类也是如此实现的,此处不再给出例子。

二、显式实例化和隐式实例化

C++模板默认的是使用的隐式实例化即Implicit Instantiation,由于模板通常是定义在头文件中的,所以在实际生成代码中,会生成多个实例,这就需要编译器和链接器在实际的处理中进行去重的处理。而显式实例化则直接给出了模板最终的生成形式,并由编译器最终生成代码。这种情况下,基本等同于一个明确的模板实现代码(类或函数),或者说最终形成的代码已经可以不认为是模板代码了。这就出现了一个问题,如果其在头文件中,则必然产生重复定义的结果。所以,显式实例化的代码必须在cpp文件中,这是与普通模板代码一般在头文件中的一个最明显的不同。
而从编译器的角度来看,显式实例化由于在cpp文件中,一则避免了编译器对普通模板代码在头文件中编译导致的代码膨胀的问题;二则也解决了链接器中的去重处理。

三、应用场景和注意点

一般来说,显式实例化的应用非常广泛,不过也只是对模板开发来说。其主要的应用场景为:

  1. 库和框架的开发
    其实大家非常容易理解,由于模板开发的复杂性和难度,一般都是在底层框架中应用,最典型的就是STL和BOOST之类的库中。
  2. 有针对性的控制模板的应用类型
    这个可以理解,在对外的接口或应用中,可以将特定类型指定为应用类型
  3. 特定代码优化
    比如某些库或模板代码需要减少模板的代码膨胀和提高链接效率(去重)等
  4. 支持新标准
    如C++11后的外部模板,extern template。关于外部模板,前面分析过,此处不再展开

需要注意的是,使用显式实例化,必须优先定义普通模板,即显式实例化的模板必须可以在编译期搜索到普通模板的定义,否则会报编译错误;另外其不适用于局部类和匿名类(这也符合模板开发的要求)。

四、例程

下面给出一个简单的例程,然后将其显式实例化的代码编译出来:

#include<string>template<typename T>Tadd(T a,T b){returna+b;}templateintadd<int>(int,int);templatefloatadd<float>(float,float);intmain(){std::string s1="1";std::string s2="2";std::string s=add(s1,s2);return0;}

编译后的代码是:

#include<string>template<typename T>Tadd(T a,T b){returna+b;}/* First instantiated from: insights.cpp:6 */#ifdefINSIGHTS_USE_TEMPLATEtemplate<>intadd<int>(inta,intb){returna+b;}#endif/* First instantiated from: insights.cpp:7 */#ifdefINSIGHTS_USE_TEMPLATEtemplate<>floatadd<float>(floata,floatb){returna+b;}#endif/* First instantiated from: insights.cpp:11 */#ifdefINSIGHTS_USE_TEMPLATEtemplate<>std::basic_string<char>add<std::basic_string<char>>(std::basic_string<char>a,std::basic_string<char>b){returnstd::operator+(a,b);}#endifintmain(){std::basic_string<char>s1=std::basic_string<char>("1",std::allocator<char>());std::basic_string<char>s2=std::basic_string<char>("2",std::allocator<char>());std::basic_string<char>s=add(std::basic_string<char>(s1),std::basic_string<char>(s2));return0;}

在上面的代码和编译后的代码进行对比可以看出来,显式实例化的代码会自动生成指定数据类型的模板实例(具现)化的代码。大家可以将模板类也以上面的形式进行处理一下,看最终的代码会是什么样。给出一个小例子,可以在此代码基础上完善:

template<typename T>class Example{public:voidadd(constT&x){};voidcount(){};};// 显式实例化template class Example<int>;template class Example<char>;

五、总结

模板的学习对于开发者来说不是一个一蹴而就的问题,需要开发者不断的将书本知识与实践反复融合。而且,随着C++最新的标准不断的完善,针对模板的相关内容(如概念等)和技术也在不断的完善,这就对开发者提出了更高的要求。不过,不要着急,休息一下,休息一下。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/21 8:08:55

盲盒抽赏小程序开发上线运营推广全维度玩法分析

在潮玩经济与线上娱乐消费深度融合的当下&#xff0c;盲盒抽赏小程序凭借“未知惊喜低门槛参与”的核心逻辑&#xff0c;成为创业者与品牌方布局线上流量的重要载体。从开发搭建到上线运营&#xff0c;每一个环节的玩法设计都直接决定小程序的留存与变现能力。本文将对开发、上…

作者头像 李华
网站建设 2026/6/13 23:39:49

计算机毕业设计springboot交通信息管理系统 基于SpringBoot的城市智慧交通综合服务平台 SpringBoot框架下的实时交通数据管理与出行诱导系统

计算机毕业设计springboot交通信息管理系统7621h9j3 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。城市化把道路挤进晚高峰的呼吸里&#xff0c;事故、拥堵、罚单、证件排队也在…

作者头像 李华
网站建设 2026/6/8 13:12:01

32、SharePoint技术综合指南

SharePoint技术综合指南 1. 基础与工具 在使用相关技术时,有一些基础的工具和设置需要了解。例如,Adobe Reader需特定版本,浏览器也有推荐版本和要求。对于文件命名,存在一些限制,像 &、?、% 等字符在文件命名时需注意。 在操作工具方面,StsAdm.exe 实用程序有众…

作者头像 李华
网站建设 2026/6/10 16:16:45

35、云端代码托管与项目管理平台综合解析

云端代码托管与项目管理平台综合解析 在软件开发领域,选择合适的代码托管和项目管理平台至关重要。它不仅影响着团队的协作效率,还关系到项目的安全性和可扩展性。以下将为大家详细介绍几个知名的平台:Assembla、XP - Dev、Codesion 和 BitBucket。 1. Assembla Assembla…

作者头像 李华
网站建设 2026/6/5 22:58:33

Zabbix 监控网站的访问量教程

在线答疑&#xff1a;乐维社区 需求&#xff1a;监控网站pv和uv的总量和5分钟内的pv和uv的增量 PV、UV是什么&#xff1f; UV&#xff1a;独立访客&#xff0c;每个独立上网电脑视为一位访客&#xff0c;一天之内网站的访客数量 PV&#xff1a;访问量&#xff0c;页面浏览量或…

作者头像 李华
网站建设 2026/6/10 22:14:01

外文文献检索网站使用指南:高效查找与获取外文文献的实用方法

生成式人工智能的浪潮正引发各领域的颠覆性变革&#xff0c;在学术研究这一知识生产的前沿阵地&#xff0c;其影响尤为显著。文献检索作为科研工作的基石&#xff0c;在AI技术的赋能下各大学术数据库已实现智能化升级。小编特别策划"AI科研导航"系列专题&#xff0c;…

作者头像 李华