c++显示实例化和显示具体化

2023-10-29

1. 实例化(instantiation)

实例化是指编译器使用函数(或者是类)模板为特定类型生成函数(类)定义。编译器不会为函数(或者类)模板生成定义,只有当我们为函数(或者类)模板指定了一个特定类型时,编译器才会生成。编译器为特定类型的函数(或者类)模板生成定义的行为被称为实例化。

template<typename T>
void Swap(T & a, T & b)
{
    T temp = a;
    a = b;
    b = temp;
}

void use_Swap(int & a, int & b)
{
    Swap(a, b);
}

举个例子,上面这段代码,通过反汇编的结果如下:

_Z4SwapIiEvRT_S1_:
	pushq	%rbp
	movq	%rsp, %rbp
	...     ...
	ret

Z4SwapIiEvRT_S1:对应的函数声明为void Swap(int&, int&),因此可以看到编译器实例化了Swap模板函数,这种实例化方法被称为隐式实例化。如果注释掉use_Swap函数,通过反汇编可以发现编译器不会实例化Swap函数,因为此时代码中只有Swap的模板函数,而没有为该函数指定一个特定类型的版本。

c++可以显示实例化一个模板函数(或者类)。

template void Swap<int>(int & a, int & b); /* 显示实例化Swap函数 */

2. 具体化(specialization)

使用模板能够极大的精简我们的代码量,尤其是在容器类或者一些通用函数中。但是,模板不能帮助我们解决所有问题。有时候我们需要针对特定的场景提供一个特殊的函数(或者类)定义,这个就是具体化。要注意实例化的具体化的区别,可以从编译器的角度来看这两者之间的区别,实例化是指编译器生成特定函数(或者类)定义;而具体化可以看做是一个特殊版本的用来生成函数(或者类)定义的方案,它只是一个方案,因此编译器不会生成定义。

struct ST;

/* 显示具体化的原型和定义应以template <> 开头 */
template <> void Swap<ST>(ST & st1, ST & st2);

上面是针对ST类型的Swap模板函数的一个显示具体化。模板类的实例化如下所示。

template<typename T>
class Swap {...};

template <> class Swap<ST> {...};

3. 部分具体化(partial specialization)

c++还允许部分具体化。template后面<>声明的是没有被具体化的参数类型。如果<>里面是空的,将导致显示具体化。

template<typename T1, typename T2>
class Swap {...};

template <typename T1> class Swap<T1, int> {...};

下面也是一种部分具体化的形式,表示该具体化版本只适用于T为原生指针的情况。

template<typename T>
class C<T*> {...};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++显示实例化和显示具体化 的相关文章

  • Python 的 pack("

    我不太了解 python 但从文档中可以看出代码 str AAAA str pack
  • 获取 TextBox 中的文本行数

    我试图通过标签显示文本框中的文本行数 但是 问题是如果最后一行为空 标签必须显示没有空行的行号 例如 如果它们有 5 行 最后一行为空 则标签应将行数显示为 4 Thanks private void txt CurrentVinFilte
  • 使用sqlbulkcopy之前如何创建表

    我有一个 DBF 文件 我正在尝试导入该文件 然后将其写入 SQL 表 我遇到的问题是 如果我使用 SqlBulkCopy 它需要我提前创建表 但在我的场景中这是不可能的 因为 dbf 文件不断变化 到目前为止 这是我的代码 public
  • 显示 div 内的用户名列表

    我是 jQuery 新手 在我的项目中 我创建了一个类User其中代码如下所示 static ConcurrentDictionary
  • C# - Visual Studio 中的 System.OutOfMemoryException

    我遇到问题 当我右键单击 Visual Studio 中的主窗体并转到 视图设计器 时 出现错误 它说 引发了 System OutOfMemoryException 类型的异常 堆栈跟踪 at System Reflection Asse
  • 如何检查号码是否只有唯一的数字?

    例如 2345 是唯一的数字 因为没有数字显示两次 但 3324 不是唯一的数字 因为 3 出现了两次 我尝试使用 但我 代码 显示但我没有得到数字我得到了数字 编辑 你不能使用字符串 number 10 number 100 number
  • ASMX Web 服务,测试表单仅在本地计算机上适用于一种 WebMethod

    我有一个正在测试的 ASMX WebService 并且在大多数方法上我都可以使用测试表单进行测试 然而 我确实有一种方法 测试表上写着 The test form is only available for requests from t
  • 如何部署包含第三方 DLL 文件的 C# 应用程序?

    首先 我对部署了解不多 我希望我的问题有意义 我需要将 C 应用程序安装 部署到多个桌面 它需要一个第三方 DLL 文件 一个 C 库 lpsolve55 dll 对于那些感兴趣的人 它是一个免费的 MIP LP 求解器 请参阅 lpsol
  • C语言中没有循环可以打印数组吗?

    例如 在Python中 如果我们将一个列表作为数组 它会直接用一行代码打印整个数组 有什么办法可以用C语言实现同样的事情吗 简短回答 No 对表格上几乎所有问题的简短回答 用 C 语言做 X 工作能像用 Python 一样简单吗 No 长答
  • 从二进制文件读取字节到 long int

    我有两个问题 我有二进制文件的数据 我想使用 read 函数读取前 8 个字节以签署 long int 但我不能 你知道我该怎么做吗 如何直接读取一块数据到字符串中 我可以像所示那样阅读吗 前任 ifstream is is open te
  • 重定向 std::cout

    我需要一个类 在其对象的生命周期内将一个 ostream 重定向到另一个 ostream 经过一番修补后 我想出了这个 include
  • 禁用实体框架的默认值生成(Code First)

    我数据库中有一个列不能为空 我想将其设置为默认值在数据库中 问题是实体框架似乎自己创建了一个默认值 例如 int gt 0 并且完全忽略了数据库中的默认值约束 有没有办法禁用实体框架的默认值 我发现您可以使用以下属性来装饰您的字段 Data
  • 在 Windows 上使用 C/C++ 开发时省略 msvcr100.dll?

    是否可以在 Windows 上使用 C C 进行开发而不链接到 msvcr100 dll 我知道这是 Windows 的标准 c 库 但我想知道如果我没有安装 Visual Studio 或 Redistributable 软件包 我的计算
  • 使用联合对 IP 地址进行多种解释?

    在工作中 我们使用以下构造来将 IP 地址解释为 4 字节数组或 32 位整数 union IPv4 std uint32 t ip std uint8 t data 4 这很好用 但是读完这本书的第 97 章 不要使用联合来重新解释表示
  • 文本框中“结束编辑”的事件

    我正在 winform c 中使用文本框 并使用文本在数据库中进行查询 但每次文本更改时 我都需要不断查阅文本框的文本 因此 对于这些 我使用 KeyUp 但这个活动太慢了 文本框编辑完成后是否会触发任何事件 我考虑完成2个条件 控制失去焦
  • 模板定义中的友元函数

    我的问题有点相关this https stackoverflow com questions 1297609 overloading friend operator for template class one 我想重载某些类的运算符 te
  • 如何使 WinForms UserControl 填充其容器的大小

    我正在尝试创建一个多布局主屏幕应用程序 我在顶部有一些按钮链接到应用程序的主要部分 例如模型中每个实体的管理窗口 单击这些按钮中的任何一个都会在面板中显示关联的用户控件 面板包含用户控件 而用户控件又包含用户界面 WinForms User
  • 如何使用“路径”查询 XDocument?

    我想查询一个XDocument给定路径的对象 例如 path to element I want 但我不知道如何继续 您可以使用以下方法System Xml XPath Extensions http msdn microsoft com
  • 检查另一种形式的线程是否仍在运行

    我有一个涉及两个窗体的 Windows 窗体应用程序 子表单用于将数据导出到 CSV 文件 并使用后台工作者写入文件 当这种情况发生时 我隐藏了表格 当后台工作程序运行时 父窗体仍然处于活动状态 因此即使后台工作程序正在写入文件 用户也可以
  • 使用方法的状态模式

    我正在尝试使用方法作为状态而不是类来基于状态模式的修改版本来实现一个简单的状态机 如下所示 private Action

随机推荐

  • DataAnalysis-Maggie-Lecture6-机器学习基础

    ML的基础框架 1定义要解决的问题 2构建数据集 3数据变换 4训练模型 5使用模型预测 example 垃圾邮件标记系统来解释术语 Dataset 一堆的邮件 Sample Instances 一封邮件 Feature Variables
  • springcloud微服务:nacos的配置说明与服务注册

    这部分我要知道两点就是nacos如何去注册服务和发现服务的 一 工程结构和版本依赖 首先要说一个我们的springcloud工程 基于半仙的springcloud工程 这个工程比较有意思 就是我很少看到pom文件一层套一层 相当于是三级po
  • 修改el-card的header的背景颜色

    修改el card的header的背景颜色 1 修改默认样式 好处是当前页面的所有的el card都会变化 页面卡片
  • linux0.00 代码阅读笔记

    汇编语言的编写 编译 运行 调试 author hjjdebug date 参考代码地址 GitHub hjjdebug linux0 00 linux0 00 code compiled under ubuntu14 04 gcc 4 8
  • Vue3的基本语法及使用(vue3尚硅谷学习笔记)

    一 Vue3的基本语法及使用 1 Vue3的基本语法 1 1 初识setup setup是Vue3中一个新的配置项 值为一个函数 组件中所要用到的数据 方法等 均要配置在setup中 setup的两种返回值 若返回一个对象 则对象中的属性
  • QT编程常见崩溃问题总结

    一 主程序事件循环函数崩溃 a exec 处崩溃 该处崩溃一般调试的时候显示的堆栈信息停止的位置都是QT的dll库 我们的代码中只给出了a exec 崩溃 原因一 子线程中更改界面上控件 在Qt事件循环中一般只有主线程可以用来改变某一个显示
  • CFSum: A Coarse-to-Fine Contribution Network for MMS

    点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入 作者 肖敏 朱军楠 林海涛 周玉 宗成庆 单位 中国科学院自动化研究所 邮箱 min xiao nlpr ia ac cn 1 摘要 多模式摘要通常存在一个问题 即视觉模态的贡献
  • 推荐10个堪称神器的 Java 学习网站

    经常有一些读者问我 二哥 学习 Java 应该关注哪些网站 我之前的态度一直是上知乎 上搜索引擎搜一下不就知道了 但读者对我这个态度很不满意 他们说 我在问你 又不是问知乎 问搜索引擎 你还别说 读者说得有道理 于是我想 那就推荐一些吧 先
  • 【人工智能

    一 什么是多模态 多模态 multimodal 是指涉及到多种模态 如视觉 语音 文本等 的数据或信息 在计算机科学和人工智能领域中 多模态通常指将多种类型的数据或信息相结合 来解决特定的问题或任务 以图像识别为例 图像可以被视为一种视觉模
  • 域中DC和AD的区别

    今天朋友问我DC和AD的区别时 我也是一脸懵X 所以我查了一些资料 做个小总结 域 我的理解是他就是一个架构 和工作组类似 和工作组最大的区别就是 工作组没有管理者 而域可以集中管理 再详细一点的解释就是在工作组上你一切的设置比如在本机上进
  • Vue引入并使用Element-UI组件库的两种方式

    前言 在开发的时候 虽然我们可以自己写css或者js甚至一些动画特效 但是也有很多开源的组件库帮我们写好了 我们只需要下载并引入即可 vue和element ui在开发中是比较般配的 也是我们开发中用的很多的 下面就介绍下如何在eue项目中
  • 博图db块变量导出_博途中,DB里定义的变量的改变

    问题描述 1 新的博途中 生成一个全局DB 打开 在第一行自动生成了 名称 为static的变量 名称无法修改 数据类型无法选择 而在老版的STEP7里 分明是一个无名称 数据类型是STRUCT 无法重新选择 的变量 为什么做了这样的改变
  • 理解super().__init__()

    目录 一 写在前面 本文仅为个人的理解 如有错误欢迎指正 二 super init 的含义 三 代码实验 四 理解super init 五 Reference 一 写在前面 本文仅为个人的理解 如有错误欢迎指正 二 super init 的
  • AdaGrad(自适应梯度算法),Adaptive

    学习衰减率 随着学习的进行 使得学习率逐渐减小 AdaGrad会为参数的每个元素适当的体哦阿正学习率 coding utf 8 import numpy as np class AdaGrad def init self learning
  • template模板:泛型化编程

    一 在函数中使用模板 template
  • macbookpro接口叫什么_了解这些常用接口一定会有用的

    日常使用手机 电脑以及其他电子产品 免不了要跟各种接口打交道 周末花了些时间查了些资料 并总结自己的实际使用经验 跟大家聊一聊我们日常使用手机 iPad 电脑 外设中常用到的接口 讲明白各种接口是一件非常复杂的事情 我会尽量只写日常中常见到
  • 【深度学习】AAAI 2024,14000篇投稿,大家都写了啥?

    夕小瑶科技说 原创作者 python 8月16日截稿的AAAI 2024 从投稿ID看 已超14000篇投稿 这么多投稿 大家都写了啥 今年什么话题最火 和往年相比 今年的投稿趋势又有什么变化 本文中 小编通过对比AAAI 2024与202
  • 文本分类(六):使用fastText对文本进行分类--小插曲

    需要注意的问题 1 linux mac 平台 2 标签中的下划线是两个 两个 两个 环境说明 python2 7 linux 自己打自己脸 目前官方的包只能在linux mac环境下使用 误导大家了 对不起 测试facebook开源的基于深
  • React全家桶-react-router原理实现

    29 9React课程 第05节 react全家桶 第5节 react全家桶 第5节 react全家桶 App js exact精确匹配 可以使用switch独占如果有一个匹配不会继续往下走 一般要与exact配合使用 否则下面不会执行 f
  • c++显示实例化和显示具体化

    1 实例化 instantiation 实例化是指编译器使用函数 或者是类 模板为特定类型生成函数 类 定义 编译器不会为函数 或者类 模板生成定义 只有当我们为函数 或者类 模板指定了一个特定类型时 编译器才会生成 编译器为特定类型的函数