我的编程空间,编程开发者的网络收藏夹
学习永远不晚

EasyC++模板显式具体化

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

EasyC++模板显式具体化

1.模板显式具体化

前文当中说了,模板函数虽然非常好用,但是也存在一些问题。比如有的操作并不是对所有类型都适用的,针对这种情况C++提供了一个解决方案,就是针对特定类型提供具体化的模板定义。这里的具体可以理解成类型的具体。

我们来看一个C++ Primer当中的例子,假设现在我们有一个结构体叫做job:


struct job {
    string name;
    double salary;
    int floor;
}


对于结构体是可以整体赋值的,所以之前的Swap函数对它一样适用。


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


但我们现在希望在交换结构体的时候,只是交换salaryfloor这两个字段,把name保持不变。由于我们希望引入逻辑变化,所以直接调用Swap函数就不可行了。

当然我们可以不用函数模板,直接重载函数:


void Swap(job &a, job &b) {
    // swap为std自带的交换函数,在algorithm头文件中
    swap(a.salary, b.salary);
    swap(a.floor, b.floor);
}


由于C++当中规定,非函数模板的优先级大于函数模板,所以我们在对job结构体调用Swap函数的时候,会优先使用这个。

除此之外,我们还可以提供一个具体化的模板函数:


template <> void Swap<job> (job &a, job &b) {
    swap(a.salary, b.salary);
    swap(a.floor, b.floor);
}

这个函数的写法看起来有些特殊,我们在函数类型之前加上了template <>,在函数名后面又跟上了<job>。它表示的是这是一个函数模板的显式具体化,也可以理解成为之前的函数模板提供一个job类型的版本。C++当中规定显式模板函数的优先级高于普通模板函数。

2.实例化和具体化

关于函数模板,还有一个很重要的概念,就是实例化。

我们在编写代码时,如果只是编写了函数模板本身,编译器是不会为我们生成函数的定义的。当编译器使用模板为特定的类型生成函数定义时,就会得到一个模板的实例。这个概念有点像是Python里的元类,元类的实例是另外一个类。

比如我们定义了一个函数模板:


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


当我们调用它,传入两个int类型的时候,编译器就会生成一个实例,这个实例使用的类型是int。当我们使用double类型的参数又一次调用的时候,编译器会继续生成double类型的实例。这个生成实例的过程是不可见的,所以被称为隐式实例化。

在早年的C++版本当中只支持隐式实例化,但现在C++允许显示实例化。也就意味着我们可以手动命令编译器创建特定的实例,比如Swap<int>() 。语法是通过<>声明指定模板类型,并且在声明之前加上关键字template,如:


template void Swap<int>(int, int);


这个语法看起来和显式具体化非常相似,显式具体化的写法是:


template<> void Swap<int>(int &, int &);
template<> void Swap(int &, int &);


看起来非常相似,但是含义是完全不同的。显式具体化的含义是对于某特定类型不要使用原模板生成函数,而应专门使用指定的函数定义。而显式实例化是使用之前的模板函数的定义的,只不过是手动触发编译器创建函数实例而已。

对了,我们不能同时在一个文件中,使用同一种类型的显式实例化和显式具体化,这会引起报错。

我们如果死记显式实例化的声明,的确很容易和具体化混淆。但我们可以在代码当中直接使用,直接使用的形式则要简单许多,只需要通过<>表明类型即可。

例如:


template <typename T>
T Add(T a, T b) {
    return a + b;
}

int main() {
 int a = 3;
 double b = 3.5;
 cout << Add<double>(a, b) << endl;
}   


在上面这段代码当中,我们通过给Add函数加上了<double>来手动创建了一个接受double类型的函数。需要注意的是,我们传入的a是一个int类型。所以编译器会执行强制类型转换,将它转换成double传入。

到此这篇关于C++模板显式具体化的文章就介绍到这了,更多相关C++模板显式具体化内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

EasyC++模板显式具体化

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何进行C++模板显式具体化的分析

如何进行C++模板显式具体化的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。模板函数虽然非常好用,但是也存在一些问题。比如有的操作并不是对所有类型都适用的,针对这种情况C+
2023-06-22

模板化编程的具体实现方式?

模板化编程允许根据类型生成代码,提高可重用性和性能。它包括:在 c++++ 中使用模板指定类型参数,并通过实例化来生成代码。利用元编程在编译时操作类型信息,实现代码生成和静态分析等功能。实战应用包括通用数据结构、算法实现和代码生成工具。模板
模板化编程的具体实现方式?
2024-05-08

C++ 函数模板的偏特化和显式实例化

c++++ 函数模板提供偏特化和显式实例化来实现特殊类型的定制实现。偏特化:允许为特定类型提供定制实现,优先于通用实现。显式实例化:强制在编译时创建特定类型的实现,提高运行时效率。C++ 函数模板的偏特化和显式实例化在 C++ 中,函数模
C++ 函数模板的偏特化和显式实例化
2024-04-15

C++模板参数的具体概念是什么

这篇文章给大家介绍C++模板参数的具体概念是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。C++编程语言是一个功能强大的计算机应用语言,它的出现在一定程度上大大降低了开发人员的负担,提高了开发效率。我们在这里先来了
2023-06-17

phpcms v9更换模板的具体操作方法

分享一下phpcms V9更换模板的具体操编程客栈作方法先分享下大概的步骤: 1、上传模版文件到服务器;2、在站点管理 里边【模板风格配置】选择新模板;3、设置不同模型对应模板;4、修改现有的栏目,匹配新模板;5、更新栏目缓存、系统缓存,更
2022-06-12

win10系统调出平板模式以体验平板效果

win10系统怎么调出平板模式?这个问题难倒很多人了吧?没http://www.cppcns.com关系,在这http://www.cppcns.com里,小编给大家分享一个教程,希望能对大家有所帮助。win10系统调出平板模式1、在系统的
2023-06-13

模板类与模板函数序列化和反序列化的实现方式?

模板类和模板函数的序列化和反序列化可以通过多种方式实现,包括使用二进制归档、自有序列化、函数指针和函数对象。使用二进制归档可将模板类直接写入/读取到文件,自有序列化则定义自定义序列化/反序列化方法。对于模板函数,可使用函数指针或函数对象对其
模板类与模板函数序列化和反序列化的实现方式?
2024-04-24

C++ 函数模板的语法及具体实现方法?

c++++函数模板允许使用泛型类型参数定义函数,使函数可以处理不同类型的数据。具体实现如下:语法:template 返回类型 函数名(输入参数列表){ // 函数体 }泛型类型参数 t:表示函数可以处理的类型。实战案例:例如,可使用sum
C++ 函数模板的语法及具体实现方法?
2024-04-15

Android 听筒模式的具体实现实例

一、利用距离感应器监听听筒靠近耳朵事件准确的说距离感应器并不能监听到你是否把手机靠近耳朵,也许是你用手挡在了距离感应器前面,但这不是我们关心的,我们关心的是当你的耳朵靠近听筒时,我们要捕获到这个事件 step 1,新建实现SensorEve
2022-06-06

Spring中的设计模式具体有哪些

今天就跟大家聊聊有关Spring中的设计模式具体有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。spring中常用的设计模式达到九种,我们举例说明。简单工厂模式又叫做静态工厂方法
2023-06-16

Flex日期格式化的具体格式有哪些

这篇文章给大家分享的是有关Flex日期格式化的具体格式有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Flex日期格式化在Flex中在类是datagrid等list控件使用labelFunction格式各种文
2023-06-17

Win10一周年更新版平板模式上手体验视频:人性化改进

很多从Win8.1升级到Win10的平板电脑用户都觉得Windows10正式版的平板模式不够好用,很多编程客栈Windows 8.1时代的快捷操作方式都被取消了。微软在接到用javascript户反馈后就在Win10一周年更新版中对这些意
2023-05-21

PHP设计模式:自动化和工具支持

php 设计模式,如工厂方法和单例,可以自动化以简化代码。工厂方法允许通过工厂创建对象,而单例确保一个类的唯一实例。利用 ide 和静态分析器等自动化工具,可以轻松地应用这些模式,从而提高代码质量。此外,策略、观察者和适配器等模式也可以自动
PHP设计模式:自动化和工具支持
2024-05-14

Win10系统查看图片显示形式的具体方法介绍

全新的Windows10系统自带了很多种不同的图片显示形式供用户选择。不过,一些刚刚升级win10的朋友,甚至都不知道该如何选择查看图片显示形式。这该怎么办呢?接下来,小编就为大家分享win10系统选择查看图片显示形式的具体方法。 具体方法
2023-05-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录