前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >EasyC++41,模板显式具体化

EasyC++41,模板显式具体化

作者头像
TechFlow-承志
发布2022-08-26 17:14:34
1870
发布2022-08-26 17:14:34
举报
文章被收录于专栏:TechFlow

作者 | 梁唐

大家好,我是梁唐。

这是EasyC++系列的第41篇,来聊聊模板显式具体化。

模板显式具体化

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

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

代码语言:javascript
复制
struct job {
    string name;
    double salary;
    int floor;
}

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

代码语言:javascript
复制
template <typename T>
void Swap(T &a, T &b) {
    T temp = a;
    a = b;
    b = temp;
}

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

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

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

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

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

代码语言:javascript
复制
template <> void Swap<job> (job &a, job &b) {
    swap(a.salary, b.salary);
    swap(a.floor, b.floor);
}

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Coder梁 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 模板显式具体化
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档