iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >EasyC++模板显式具体化
  • 350
分享到

EasyC++模板显式具体化

2024-04-02 19:04:59 350人浏览 泡泡鱼
摘要

目录1.模板显式具体化2.实例化和具体化1.模板显式具体化 前文当中说了,模板函数虽然非常好用,但是也存在一些问题。比如有的操作并不是对所有类型都适用的,针对这种情况c++提供了一个

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++模板显式具体化内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: EasyC++模板显式具体化

本文链接: https://www.lsjlt.com/news/160110.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • EasyC++模板显式具体化
    目录1.模板显式具体化2.实例化和具体化1.模板显式具体化 前文当中说了,模板函数虽然非常好用,但是也存在一些问题。比如有的操作并不是对所有类型都适用的,针对这种情况C++提供了一个...
    99+
    2024-04-02
  • 如何进行C++模板显式具体化的分析
    如何进行C++模板显式具体化的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。模板函数虽然非常好用,但是也存在一些问题。比如有的操作并不是对所有类型都适用的,针对这种情况C+...
    99+
    2023-06-22
  • 模板化编程的具体实现方式?
    模板化编程允许根据类型生成代码,提高可重用性和性能。它包括:在 c++++ 中使用模板指定类型参数,并通过实例化来生成代码。利用元编程在编译时操作类型信息,实现代码生成和静态分析等功能。...
    99+
    2024-05-08
    模板化编程 具体实现方式 c++
  • C++ 函数模板的偏特化和显式实例化
    c++++ 函数模板提供偏特化和显式实例化来实现特殊类型的定制实现。偏特化:允许为特定类型提供定制实现,优先于通用实现。显式实例化:强制在编译时创建特定类型的实现,提高运行时效率。 C...
    99+
    2024-04-15
    函数模板 偏特化 显式实例化 c++
  • C++模板参数的具体概念是什么
    这篇文章给大家介绍C++模板参数的具体概念是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。C++编程语言是一个功能强大的计算机应用语言,它的出现在一定程度上大大降低了开发人员的负担,提高了开发效率。我们在这里先来了...
    99+
    2023-06-17
  • C++11中模板隐式实例化与显式实例化的定义详解分析
    目录1. 隐式实例化2. 显式实例化声明与定义3. 显式实例化的用途1. 隐式实例化 在代码中实际使用模板类构造对象或者调用模板函数时,编译器会根据调用者传给模板的实参进行模板类型推...
    99+
    2024-04-02
  • win10系统调出平板模式以体验平板效果
      win10系统怎么调出平板模式?这个问题难倒很多人了吧?没   win10系统调出平板模式   1、在系统的开始菜单中打开设置(Setting);   2、在设置框中选择系统(System);   3、将设置界面左边...
    99+
    2023-06-13
    win10 平板模式 平板 效果 系统 模式
  • 模板类与模板函数序列化和反序列化的实现方式?
    模板类和模板函数的序列化和反序列化可以通过多种方式实现,包括使用二进制归档、自有序列化、函数指针和函数对象。使用二进制归档可将模板类直接写入/读取到文件,自有序列化则定义自定义序列化/反...
    99+
    2024-04-24
    模板函数 模板类 c++
  • C++ 函数模板的语法及具体实现方法?
    c++++函数模板允许使用泛型类型参数定义函数,使函数可以处理不同类型的数据。具体实现如下:语法:template 返回类型 函数名(输入参数列表){ // 函数体 }泛型类型参数 t...
    99+
    2024-04-15
    c++ 函数模板
  • Python格式化输出的具体实现
    目录“%”的使用字符串输出(%s)浮点数输出(%f)format的使用位置匹配格式转换高阶用法format变形用法“%”的使用 格式符...
    99+
    2024-04-02
  • javascript中的设计模式具体有哪些
    javascript中的设计模式具体有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。javascript中的设计模式有:单例模式、策略模式...
    99+
    2024-04-02
  • Spring中的设计模式具体有哪些
    今天就跟大家聊聊有关Spring中的设计模式具体有哪些,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。spring中常用的设计模式达到九种,我们举例说明。简单工厂模式又叫做静态工厂方法...
    99+
    2023-06-16
  • Flex日期格式化的具体格式有哪些
    这篇文章给大家分享的是有关Flex日期格式化的具体格式有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Flex日期格式化在Flex中在类是datagrid等list控件使用labelFunction格式各种文...
    99+
    2023-06-17
  • Win10一周年更新版平板模式上手体验视频:人性化改进
     很多从Win8.1升级到Win10的平板电脑用户都觉得Windows10正式版的平板模式不够好用,很多 新的平板模式请回了一些Win8.1的便捷操作,还加入了一些全新的操作功能,而且还会在平板模式隐藏任务栏...
    99+
    2023-05-21
    Win10 一周年更新 平板
  • SpringBoot Redis 发布订阅模式(Pub/Sub)的具体使用
    目录Redis命令行下使用发布订阅 publish 发布 subscribe 订阅 SpringBoot中使用Redis的发布订阅功能 发布者 订阅者 消息监听容器 注意:redis...
    99+
    2024-04-02
  • PHP设计模式:自动化和工具支持
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-14
  • Win10系统查看图片显示形式的具体方法介绍
    全新的Windows10系统自带了很多种不同的图片显示形式供用户选择。不过,一些刚刚升级win10的朋友,甚至都不知道该如何选择查看图片显示形式。这该怎么办呢?接下来,小编就为大家分享win10系统选择查...
    99+
    2023-05-20
    Win10 图片 显示形式
  • 怎么用模板方法+策略+工厂方法模式来优化代码
    这篇文章主要讲解了“怎么用模板方法+策略+工厂方法模式来优化代码”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用模板方法+策略+工厂方法模式来优化代码”...
    99+
    2024-04-02
  • ASP.NET GridView 中模板化的奥秘:释放自定义显示的无限潜力
    数据项模板 (ItemTemplate) 数据项模板定义了 GridView 中每行的 HTML 结构。它定义了如何呈现特定列中的数据。您可以使用绑定表达式将数据字段直接插入 HTML,或使用代码在运行时操纵数据。 编辑项模板 (Edit...
    99+
    2024-04-02
  • Linux桥接模式下设置静态IP具体方法是什么
    今天给大家介绍一下Linux桥接模式下设置静态IP具体方法是什么。文章的内容小编觉得不错,现在给大家分享一下,觉得有需要的朋友可以了解一下,希望对大家有所帮助,下面跟着小编的思路一起来阅读吧。网上可以搜到一大堆文章,通俗点讲,NAT模式下,...
    99+
    2023-06-28
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作