c++外部模板

一、什么是外部模板

模板的优势估计很多人都知道,但是模板的劣势也有不少,其中,代码膨胀就是其中之一(其它还有不易理解、不易调试等)。在实际情况中可能会有下面这种情况:

//tempFun.h
#pragma oncetemplate<typename T,typename N>
T Add(T t, N n)
{return t + n;
}
//test.h
#pragma once
void First(int a,int b);
void Second(int a,int b);//first.cpp
#include "iostream"
#include "tempFun.h"
#include "test.h"void First(int a, int b)
{std::cout << Add(a,b) << std::endl;
}
//second.cpp
#include "iostream"
#include "tempFun.h"
#include "test.h"void Second(int a, int b)
{std::cout << Add(a, b) << std::endl;
}
//main.cpp
#include "test.h"
#include <Windows.h>int main()
{First(10,1);Second(11,2);system("pause");return 0;
}

上面的示例代码非常简单,但可以说明一个问题,在上一篇中提到过,c++的编译是以CPP为单元进行的,模板如果不使用就不会生成代码,那么如果在两个CPP文件中使用一样的数据类型会产生什么样的情况呢?比如上在这种情形,都是int类型,只是数据略有不同。答案是编译器肯定会生成两个完全相同的函数。然后在后续的过程中(包含链接等)会通过技术手段去除重复的代码,来实现单一副本。但是,扩展开来,如果一个工程非常大,编译器等经常做类似的工作,对生成效率的影响,估计可以想象的到。
学习c++/c语言的人,都会接触到extern关键字,知道一个全局变量可以通过其来进行外部声明。同样,在模板中,也可以使用这种方式。在c++11中引用了外部模板,就是通过这个关键字来解决这个问题的。

二、外部模板使用

在c++11中引入的外部模板,类似于extern一个全局变量的编译链接过程,如果发现这个关键字,就不再本地再来一份生成代码了。这样,就减少了前面提到的单一副本的处理过程了。看一个实例:

//其它类似,只修改使用的两个CPP
//first.cpp
#include "iostream"
#include "tempFun.h"
#include "test.h"template int Add<int,int>(int,int);
void First(int a, int b)
{std::cout << Add(a,b) << std::endl;
}
//second.cpp
#include "iostream"
#include "tempFun.h"
#include "test.h"
extern template int Add<int,int>(int,int);
void Second(int a, int b)
{std::cout << Add(a, b) << std::endl;
}

上面的代码可以看出,其实是利用了显示实例化来实现这个问题,在以前的文章中说过,显示实例化只能一次,而且要放到CPP文件中,这里与之类似。首先在一个编译单元中将其显示实例化,然后在另外一个编译单元中使用extern关键字来声明其它单元中已经生成了这个代码。不过和全局变量相同,必须保证有实际的定义之处,否则编译会报链接错误。
需要注意的是,在一些IDE的开发环境中,会发现extern部分的函数会提示找不到实现,这是因为模板需要在编译期才会生成相关的实现代码,恰恰说明了上面的问题。如果大家有兴趣,也可以自己实验一番。
外部模板的使用有一些限制场景:
1、可以用于类内的静态函数,而不能用于全局的静态函数。
2、目前对内联的支持看编译器的实现。
3、外部模板只支持类成员而不支持类本身。

三、总结

其实从实际情况来看,决大多数的工程其实对这个外部模板是不感冒的,因为,其工程的大小可控。这就使得这个东西变成了鸡肋,所以说,对其的使用,还是根据自己的实际的情况来处理。说的直白一些,就是平衡效率和修改使用的工作量。
《2019-10-13 09:27》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/25532.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二维鱼游CFD代码

最近学了会Julia&#xff0c;参考了原作者的shark&#xff0c;做一下基于airfoils 2D的鱼游&#xff0c;暂时没想好有什么需要深入研究的&#xff0c;代码公开如下&#xff1a; 鱼身是naca0016&#xff0c;然后一些参数可以参考我以前发的论文。 using WaterLily, StaticArra…

牛客网刷题 | BC117 逆序输出

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 输入10个整数&…

表格状态码转换,其他索引串转成名字

1.问题分析 原数据库 关联指标为数字串的形式&#xff0c;每个小数对应的是另一张表index的属性&#xff0c;我们想知道对应指标的名称&#xff0c;怎么在这里下面这种形式呢&#xff1f; 两种思路&#xff1a; 1.修改在后端处理&#xff0c;把后端关联指标部分修改成图二的…

【Qt】Qt常见的数据类型

思维导图 学习目标 一、基础类型 因为Qt是一个C的框架&#xff0c;因此C的语法和数据类型在Qt中都是被支持的&#xff0c;但是Qt中也是定义了一些属于自己的数据类型&#xff0c;不过&#xff0c;好多数据类型都是对C的数据类型进行封装&#xff0c;下面来简要介绍一下这些基…

Windows环境如何使用Flutter Version Manager (fvm)

Windows环境如何使用Flutter Version Manager (fvm) Flutter Version Manager (fvm) 是一个用于管理多个 Flutter SDK 版本的命令行工具&#xff0c;它允许开发者在不同项目之间轻松切换 Flutter 版本。这对于需要维护多个使用不同 Flutter 版本的项目的开发人员来说非常有用。…

在docker容器中使用gdb调试python3.11的进程

gdb调试python进程的前提条件 安装python及python调试信息安装gdb工具安装python-gdb.py扩展 安装过程 我们使用docker来安装以上内容&#xff0c;Dockerfile文件内容如下&#xff1a; FROM docker.io/centos:7.4.1708# 安装依赖 RUN yum install -y -q epel-release &…

对称加密系统解析

目录​​​​​​​ 1.概述 2. 对称密码类型 3. 对称加密优缺点 4. 对称加密算法 4.1 DES 4.2 3DES 4.3 AES ​​​​​​4.4 SM1 4.5 SM4 1.概述 对称加密&#xff0c;是指在加密和解密时使用同一秘钥的方式。秘钥的传送和保存的保护非常重要&#xff0c;务必不要让秘…

突破网络屏障:掌握FRP内网穿透技术

1.FRP介绍 1.frp是什么 frp 是一款高性能的反向代理应用&#xff0c;专注于内网穿透。它支持多种协议&#xff0c;包括 TCP、UDP、HTTP、HTTPS 等&#xff0c;并且具备 P2P 通信功能。使用 frp&#xff0c;您可以安全、便捷地将内网服务暴露到公网&#xff0c;通过拥有公网 I…

LeetCode | 1.两数之和

这道题&#xff0c;很容易想到的是暴力解&#xff0c;直接一个双重循环&#xff0c;对于数组中的每一个数&#xff0c;都去遍历其他数字&#xff0c;看能不能找到数字等于target-nums[i]的数字&#xff0c;时间复杂度为 O ( n 2 ) O(n^2) O(n2) 但是通过其他题目&#xff0c;我…

计算机毕业设计 | SpringBoot宠物医院管理 宠物商城购物系统(附源码)

写在前面 Le Dao宠物医院管理系统是一个超大型的&#xff0c;完成度很高的&#xff0c;集宠物医疗、宠物美容、宠物交易、宠物周边等各种功能于一身的&#xff0c;权限涵盖普通用户、医生、化验师、美容师、仓库主管、采购员等多种角色于一体的大型宠物医疗&#xff0c;购物系…

如何提高工作效率?

完成大于完美 在工作中&#xff0c;时间紧张时&#xff0c;及时交付才是最重要的。 完成大于完美。 分清优先级&#xff0c;高优先级的事情先做 轻重缓急&#xff0c;优先做高优先级的事情。 优先级低的&#xff0c;先放一边。 依赖他人的事情先做 依赖他人的事情先做。…

AI大模型在健康睡眠监测中的深度融合与实践案例

文章目录 1. 应用方案2. 技术实现2.1 数据采集与预处理2.2 构建与训练模型2.3 个性化建议生成 3. 优化策略4. 应用示例&#xff1a;多模态数据融合与实时监测4.1 数据采集4.2 实时监测与反馈 5. 深入分析模型选择和优化5.1 LSTM模型的优势和优化策略5.2 CNN模型的优势和优化策略…

java版多语言抢单系统 多语言海外AEON抢单可连单加额外单源码 抢单平台搭建开发 抢单开挂的软件

此套是全新开发的java版多语言抢单系统。 后端java&#xff0c;用的若依框架&#xff0c;这套代码前后端是编译后的&#xff0c;测试可以正常使用&#xff0c;语言繁体&#xff0c;英文&#xff0c;日语 源码大小&#xff1a;155M 源码下载&#xff1a;https://download.csd…

图像处理方向信息

前言 Exif 规范 定义了方向标签&#xff0c;用于指示相机相对于所捕获场景的方向。相机可以使用该标签通过方向传感器自动指示方向&#xff0c;也可以让用户通过菜单开关手动指示方向&#xff0c;而无需实际转换图像数据本身。 在图像处理过程中&#xff0c;若是原图文件包含…

Layui弹框中设置输入框自动获取焦点无效/Layui设置Input框自动获取焦点无效,怎么办?

1、问题概述? 有时候为了用户体验,期望当弹框打开的时候,指定的输入框能自动的获取焦点,用户就可以直接输入了。提升了用户体验。但有时候设置的时候没有效果。 2、正常的设置自动获取焦点方式 【input框设置方式】 使用关键字autofocus <input type="text&quo…

Zemax中FFT PSF和惠更斯PSF的区别?

在Zemax“分析”选项卡中&#xff0c;有PSF&#xff08;“点扩散函数”&#xff09;图&#xff0c;主要包括如下两种计算方式&#xff1a; 1. FFT PSF&#xff0c;快速傅里叶变换&#xff08;fast fourier transform&#xff0c;FFT&#xff09; 该方法可以看做是以下点扩散函…

ffmpeg将一个视频中的音频合并到另一个视频

ffmpeg -i input1.mp4 -i input2.mp4 -map 1:v -map 0:a -c:v copy -c:a aac -strict experimental output.mp4解释如下&#xff1a; -i input1.mp4&#xff1a;指定第一个输入文件input1.mp4&#xff0c;这是你要提取音频的文件。-i input2.mp4&#xff1a;指定第二个输入文件…

概率论中,积分和再求导的计算方法

为了求解级数 1 2 2 q 3 2 q 2 … 1 2^2q 3^2q^2 \ldots 122q32q2… 的和&#xff0c;可以使用积分再求导的方法。我们考虑如下步骤&#xff1a; 1. 定义函数并进行积分 我们先定义一个函数 S ( q ) S(q) S(q)&#xff1a; S ( q ) ∑ n 1 ∞ n 2 q n − 1 S(q) \…

心链14-----项目功能完善补坑+自动跳转登录页 + 重复加入队伍问题(分布式锁) 并发请求问题解决 + 项目部署上线

心链 — 伙伴匹配系统 一、todo 1、强制登录&#xff0c;自动跳转到登录页 解决&#xff1a;axios 全局配置响应拦截、并且添加重定向 1.在myAxios里配置响应拦截 这里我们要改变history 模式的实现&#xff0c;在main.ts里修改 当登录成功后&#xff0c;重定向到个人用户页…

Cyber Weekly #10

赛博新闻 1、最强开源大模型面世&#xff1a;阿里发布Qwen2 6月7日凌晨&#xff0c;阿里巴巴通义千问团队发布了Qwen2系列开源模型。该系列模型包括5个尺寸的预训练和指令微调模型&#xff1a;Qwen2-0.5B、Qwen2-1.5B、Qwen2-7B、Qwen2-57B-A14B以及Qwen2-72B。据Qwen官方博客…