news 2026/5/28 14:57:34

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/28 15:02:14

FCKEditor支持WORD公式粘贴PPT幻灯片公式处理

企业级文档导入功能集成方案 1. 需求分析与技术选型 1.1 核心需求 Word粘贴导入功能&#xff1a;支持从Word、Excel、PPT、PDF导入&#xff0c;保留样式&#xff08;表格、公式、字体等&#xff09;。微信公众号内容解析&#xff1a;自动下载图片并上传至服务器&#xff08;…

作者头像 李华
网站建设 2026/5/23 23:43:39

为什么顶尖团队都在用AutoGLM?:深度拆解其工程化落地的4大优势

第一章&#xff1a;智普Open-AutoGLM 沉思在人工智能与自动化深度融合的当下&#xff0c;智普推出的 Open-AutoGLM 项目为大语言模型的自主任务执行开辟了新路径。它不仅继承了 GLM 系列模型强大的语义理解能力&#xff0c;更通过可编程接口实现了任务规划、工具调用与反馈闭环…

作者头像 李华
网站建设 2026/5/23 13:18:44

React表单与事件处理:编辑按钮触发提交的坑

在React应用开发中,表单处理和事件处理是常见的操作,开发者常常会遇到一些看似简单但却让人困惑的问题。今天,我们来探讨一个常见的问题:为什么点击编辑按钮会触发表单的提交事件?让我们通过一个实例来详细分析这个问题,并提供解决方案。 问题背景 假设我们有一个用户数…

作者头像 李华
网站建设 2026/5/28 17:03:38

GPT-SoVITS在语音导航系统中的定制化实现

GPT-SoVITS在语音导航系统中的定制化实现 在智能座舱日益成为汽车“第二生活空间”的今天&#xff0c;用户对车载交互体验的期待早已超越基础功能。尤其是在长途驾驶中&#xff0c;一段亲切、自然甚至带有熟悉音色的导航提示&#xff0c;不仅能提升安全性&#xff0c;还能缓解疲…

作者头像 李华
网站建设 2026/5/8 8:51:39

高效刷题指南:如何用好vijos在线评测系统备战竞赛

在信息学竞赛的备赛过程中&#xff0c;一个稳定、高效的在线评测系统&#xff08;OJ&#xff09;至关重要。它不仅提供了海量的题库资源&#xff0c;更是检验算法实现正确性与代码效率的核心平台。对于众多算法学习者而言&#xff0c;熟练使用一个优秀的OJ&#xff0c;是提升实…

作者头像 李华
网站建设 2026/5/28 17:10:35

从入门到精通:Open-AutoGLM环境搭建与推理部署全流程解析

第一章&#xff1a;Open-AutoGLM 安装使用环境准备 在开始安装 Open-AutoGLM 之前&#xff0c;确保系统已配置 Python 3.9 或更高版本&#xff0c;并推荐使用虚拟环境以隔离依赖。可通过以下命令创建并激活虚拟环境&#xff1a;# 创建虚拟环境 python -m venv open-autoglm-env…

作者头像 李华