C++之模板(一)

1、为什么需要模板

将具有相同逻辑的一段代码提供一份模板,当我们需要处理不同类型的时候,可以通过数据类型当作参数来传递,从而实例化出对应类型的处理版本。

2、模板的定义

也是一种静态多态。

3、模板的分类

4、函数模板

5、函数模板的使用

通常我们把模板的实现放在.h文件中,不放在.cpp文件中,因为编译的时候需要去推导模板函数,这个时候如果放在cpp文件中,则实例化的时候找不到实现。

#include <iostream>
using namespace std;

template <typename T>
const T& max(const T& a, const T& b)
{
    return a < b ? b : a;
}

// 编译过后会生成模板函数,但是不可见
//const int& max(const int& a, const int& b)
//{
//    return a < b ? b : a;
//}

class Test
{
public:
    friend bool operator<(const Test& t1, const Test& t2)
    {
        return true;
    }
};

int main() {
    cout << ::max(5.5, 6.6) << endl;  // 编译器根据参数自动推导出模板函数
    cout << ::max('a', 'c') << endl;

    Test t1;
    Test t2;
    ::max(t1, t2);
    return 0;
}

6、函数模板特化

当你传入的是指针的类型的话,则比较的是指针的大小,而不是指针指向内容的大小,这样不符合我们预期,所以需要特化。特化表示我们组要给特殊的类型做特殊的操作。

没加特化前:

template <typename T>
const T& max(const T& a, const T& b)
{
    return a < b ? b : a;
}

class Test
{
public:
    friend bool operator<(const Test& t1, const Test& t2)
    {
        return true;
    }
};

int main() {

    const char* str1 = "zzz";
    const char* str2 = "aaa";
    cout << ::max(str1, str2) << endl;
    return 0;
}

// 输出
aaa

加上特化后:

#include <iostream>
using namespace std;

#include <cstring>

template <typename T>
const T& max(const T& a, const T& b)
{
    return a < b ? b : a;
}

// 函数模板特化
template <>
const char* const& max(const char* const& a, const char* const& b)
{
    return strcmp(a, b) < 0 ? b : a;
}


class Test
{
public:
    friend bool operator<(const Test& t1, const Test& t2)
    {
        return true;
    }
};

int main() {

    const char* str1 = "zzz";
    const char* str2 = "aaa";
    cout << ::max(str1, str2) << endl;
    return 0;
}

// 输出
zzz

7、重载函数模板

模板特化还算是模板函数,但是非模板函数重载,已经不算模板函数。

#include <iostream>
using namespace std;

#include <cstring>

template <typename T>
const T& max(const T& a, const T& b)
{
    return a < b ? b : a;
}

// 函数模板重载
template <typename T>
const T& max(const T& a, const T& b, const T& c)
{
    return ::max(a, b) < c ? c : ::max(a, b);
}

// 非模板函数重载
const int& max(const int& a, const int& b)
{
    cout << "non template" << endl;
    return a < b ? b : a;
}

// 函数模板特化
template <>
const char* const& max(const char* const& a, const char* const& b)
{
    return strcmp(a, b) < 0 ? b : a;
}


int main() {

    cout << ::max(1, 5, 3) << endl;

    cout << ::max('a', 100) << endl;  // 非函数模板中将字符隐式转化成整型

    cout << ::max(94, 100) << endl;

    cout << ::max<>(94, 100) << endl;  // 自动推导max(const int& a, const int& b)
    cout << ::max<int>(97, 100) << endl;  // 显示指定模板函数(加上<>表示要使用模板函数)
    cout << ::max<int>('a', 100) << endl;
    return 0;
}

// 输出
5
non template
100
non template
100
100
100
100

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

夏季家里粉尘螨虫满天飞?一招搞定!好用家用空气净化器品牌分享

每到夏季&#xff0c;是家中尘螨滋生的高发期。夏季无论是开窗通风还是关窗开空调&#xff0c;都很容易造成空气中的浮尘堆积&#xff0c;不注意卫生清洁&#xff0c;容易滋生细菌、尘螨。 易过敏、体质弱的人群长时间在空气污染环境中&#xff0c;很容易就会过敏或者发生其他…

openh264 SVC 时域分层原理介绍

openh264 OpenH264是一个开源的H.264编码器&#xff0c;由Cisco公司开发并贡献给开源社区。它支持包括SVC&#xff08;Scalable Video Coding&#xff09;在内的多种编码特性&#xff0c;适用于实时应用场景&#xff0c;比如WebRTC。OpenH264项目在GitHub上是公开的&#xff0…

外链是否会增加流量?

外链确实可以间接地帮助增加网站流量&#xff0c;不过要了解的是这不是直接影响&#xff0c;首先&#xff0c;外链主要是提升你的网站在搜索引擎中的整体权重。简单地说&#xff0c;当你的网站被很多其他的网站通过dofollow链接指向时&#xff0c;搜索引擎会认为你的网站内容质…

如何完美解决 Xshell 使用 SSH 连接 Linux 服务器报错:找不到匹配的 host key 算法

&#x1f6e0;️ 如何完美解决 Xshell 使用 SSH 连接 Linux 服务器报错&#xff1a;找不到匹配的 host key 算法 摘要&#xff1a; 本文将带领大家深入学习如何解决 Xshell 使用 SSH 连接 Linux 服务器时报错“找不到匹配的 host key 算法”的问题。通过详细的操作步骤和代码案…

有什么可以创建ai聊天的软件?5个软件帮助你快速创建ai聊天

有什么可以创建ai聊天的软件&#xff1f;5个软件帮助你快速创建ai聊天 AI聊天软件是一种利用人工智能技术构建的聊天机器人系统&#xff0c;它能够模拟人类的对话方式&#xff0c;回答用户提出的问题或者进行对话。这类软件在各个领域都有广泛的应用&#xff0c;可以用于客户服…

从Instance classifier重新思考多实例学习

弱监督的WSI分类通常被形式化为多实例学习&#xff08;MIL&#xff09;问题&#xff0c;其中每张slide都被视为一个bag&#xff0c;从中切出的patch被视为实例。现有的方法要么通过伪标记训练实例分类器&#xff0c;要么通过注意力机制将实例特征聚合为bag特征&#xff0c;然后…

Shopee虾皮API:获取商家店铺商品列表

一、平台介绍 Shopee&#xff0c;作为东南亚及中国台湾地区领先的电商平台&#xff0c;为卖家提供了一个便捷、高效的销售渠道。作为卖家&#xff0c;能够将自己的商品展示在Shopee平台上&#xff0c;并通过平台的流量和工具&#xff0c;将商品销售给更多的潜在买家。 为了帮…

Elasticsearch-使用Logstash同步Mysql

1.安装logstash es服务器版本必须和logstash版本一致 7.9.2 在/usr/local/src/下新建logstash文件夹&#xff0c;解压 下载logstash后查看是否安装成功&#xff0c;在logstash的bin目录下输入指令&#xff1a; ./logstash -e input { stdin { } } output { stdout {} }2.my…

Java项目:基于SSM框架实现的汽车养护保养管理系统【ssm+B/S架构+源码+数据库+开题+毕业论文+任务书】

一、项目简介 本项目是一套基于SSM框架实现的汽车养护保养管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、…

【Java05】Java中的多维数组

从数组底层运行机制上看&#xff0c;Java没有多维数组一说。所谓多维数组&#xff0c;是说一个引用变量指向的元素也是引用变量。 例如&#xff0c;type[] arrayName是个指向type类型元素的数组。倘若type也是数组引用变量&#xff0c;比如int[]&#xff0c;那么这个数组就可以…

警惕!ELSEVIER旗下1本双1区TOP被On Hold !请大家谨慎投稿

【SciencePub学术】又1本&#xff01;双1区TOP刊被On Hold &#xff01;官方现在对期刊质量的管控越来越严格了&#xff0c;被标记为On Hold后的期刊中&#xff0c;大部分的命运也是被WOS数据库剔除&#xff01;所以请大家谨慎投稿&#xff01; 《Information Sciences》作为一…

Spring Security+Spring Boot实现登录认证以及权限认证

基本概念 “Authentication(认证)”是spring security框架中最重要的功能之一&#xff0c;所谓认证&#xff0c;就是对当前访问系统的用户给予一个合法的身份标识&#xff0c;用户只有通过认证才可以进入系统&#xff0c;在物理世界里&#xff0c;有点类似于“拿工卡刷门禁”的…

【达梦数据库】typeorm+node.js+达梦数据库返回自增列值

1.配置环境&#xff0c;下载依赖包 typeorm init --name test22 --database mysql typeorm-dm&#xff0c;uuid,typeorm2,修改连接信息 修改src/ data-source.ts 文件 连接dm&#xff0c;可参考刚刚安装typeorm-dm 模块中的 README.md 3.修改自增信息 /* 修改前*/PrimaryGen…

HarmonyOS之自选股App

支持在 鸿蒙、安卓、苹果设备上运行。 1.界面效果展示 2.数据存储 数据存储采用的是官方的 ohos.data.relationalStore.relationalStore stock_code表用来存储A股市场5000多家公司的股票代码和名称等信息 const TAB_STOCK_CODE "stock_code" const CREATE_TABL…

思科配置:vlan、两个交换机、两个路由器、四台主机

一、如图配置 各设备ip地址、接口、vlan如图所示。 二、配置各主机ip、子网掩码、默认网关 PC0 PC8 PC1 PC9 PC2 PC10 PC3 PC11 三、配置Switch0 &#xff08;期间报错为拼写错误&#xff09; MySwitch0> MySwitch0>en MySwitch0#conf t Enter configuration co…

《珊瑚岛》是一款什么类型的游戏 苹果电脑如何玩到《珊瑚岛》

在众多电子游戏中&#xff0c;有些游戏因其独特的游戏体验和丰富的内容而脱颖而出&#xff0c;《珊瑚岛》便是其中之一。在游戏中你将离开宝京前往珊瑚岛&#xff0c;种植农作物、饲养动物、和岛民成为朋友。您不仅可以振兴该岛小镇&#xff0c;还可以保护和修复周围的珊瑚礁。…

2毛钱的SOT23-5封装单运放LMV321支持轨到轨输出

前言&#xff1a; 运放比三极管放大电路更简洁、PCB占用空间小&#xff0c;该LMV321单价较低&#xff0c;且支持轨到轨&#xff0c;TI的单价约0.4元&#xff0c;国产有多家半导体厂商有替代产品&#xff0c;追求性价比的可以选择国产LMV321&#xff0c;参考价格约0.2元。在多数…

市场情绪周期2024-6-17(补涨回头潮视角验证)

竞价隔夜单 看长江通信&#xff0c;38亿涨到40亿又回落&#xff0c;那么周末最大的利好消息加持下&#xff0c;隔夜单不及预期&#xff0c;金溢科技 更是如此&#xff1b;空间板华闻集团8天7板&#xff0c;连扳5板&#xff0c;一字跌停&#xff0c;它也是有车联网的&#xff0c…

visual studio下载安装

1、下载网址&#xff1a;下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux 选择下载“社区” 2、下载好之后&#xff0c;安装在非系统盘上&#xff0c;在下面这个界面上&#xff0c;大家可以把自己需要的都勾选上&#xff0c;然后更改安装地址 安装完即可

嵌入式技术学习——c51——串口

一、串口介绍。 串口是一个 通讯接口。成本低&#xff0c;容易使用&#xff0c;通信线路简单&#xff0c;可实现两个设备的相互通信 单片机的串口可以实现单片机于单片机&#xff0c;单片机与电脑&#xff0c;单片机与其他模块相互通信。 51单片机内部自带UART&#xff0c;通…