C++中模板的初级使用函数模板(刚刚接触模板概念的小白也能明白)

文章目录

  • 模板分类
  • 函数模板
  • 函数模板的原理
  • 函数模板基本语法 —— typename 以及 class
  • 简单的函数模板
  • 多类型模板参数
  • class 和 typename 的选择
  • 类模板

模板分类

模板的核心思想是让编译器在编译时生成适用于具体类型的代码,这个过程称为模板实例化。C++ 中的模板分为两种:函数模板和类模板。
在这里插入图片描述
本文对于模板的讲解仅包含模板中函数模板的部分,即初阶讲解类模板仅包含一小部分提供一些示例

函数模板

  1. 泛型编程
    如何实现一个通用的交换函数呢?
    接下来我们通过我们常见的一个简单函数进行引入:
void Swap(int& left, int& right)
 {
 int temp = left;
 left = right;
 right = temp;
 }
 void Swap(double& left, double& right)
 {
 double temp = left;
 left = right;
 right = temp;
 }
 void Swap(char& left, char& right)
 {
 char temp = left;
 left = right;
 right = temp;
 }
 ......

使用函数重载虽然可以实现,但是有一下几个不好的地方:

  1. 重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数
  2. 代码的可维护性比较低,一个出错可能所有的重载均出错那能否告诉编译器一个模子,让编译器根据不同的类型利用该模子来生成代码呢?

这是我们经常写的两个值交换函数,但是在我们交换不同类型数据的时候,我们就需要对这个交换函数再进行一份书写,这样就会显得整个代码程序写的非常冗余,所以在C++当中,引出了模板的这个概念

在 C++ 中,函数模板是一种可以编写泛型代码的机制。它允许你编写一个函数,而不需要预先定义具体的数据类型。函数模板可以用于处理不同类型的参数,而不需要为每个类型编写不同的函数。通过函数模板,C++ 提供了一种类型无关的编程方法。

函数模板的原理

在这里插入图片描述
在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。

函数模板基本语法 —— typename 以及 class

template <typename T>
返回类型 函数名(参数列表) {
    // 函数体
}

template <classs T>
返回类型 函数名(参数列表) {
    // 函数体
}

在模板参数列表中,class 和 typename 是等价的,可以互换使用。

简单的函数模板

示例:

#include <iostream>
using namespace std;

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

int main() {
    cout << add(3, 4) << endl;        // 整数相加,输出 7
    cout << add(3.5, 4.2) << endl;    // 浮点数相加,输出 7.7
    return 0;
}

在这个例子中,add 函数是一个模板函数,它接受两个类型相同的参数,并返回它们的和。模板参数 T 使得这个函数能够同时处理 int、double 等多种类型。

#include <iostream>
using namespace std;

template <class T>
T max_value(T a, T b) {
    return (a > b) ? a : b;
}

int main() {
    cout << max_value(10, 20) << endl;         // 整数比较,输出 20
    cout << max_value(3.14, 2.71) << endl;     // 浮点数比较,输出 3.14
    return 0;
}

在这个例子中,模板参数 T 可以是任何类型,当我们调用 max_value 时,C++ 编译器会根据传递的参数自动推导 T 的类型。这个函数模板可以处理整数、浮点数等不同类型。

多类型模板参数

函数模板可以包含多个模板参数,允许不同类型的输入。例如:

#include <iostream>
using namespace std;

template <typename T1, typename T2>
auto multiply(T1 a, T2 b) -> decltype(a * b) {
    return a * b;
}

int main() {
    cout << multiply(10, 2.5) << endl; // 整数和浮点数相乘,输出 25.0
    return 0;
}
#include <iostream>
using namespace std;

template <class T1, class T2>
auto add(T1 a, T2 b) -> decltype(a + b) {
    return a + b;
}

int main() {
    cout << add(10, 2.5) << endl;       // 整数和浮点数相加,输出 12.5
    cout << add(100L, 200) << endl;     // 长整型和整型相加,输出 300
    return 0;
}

class 和 typename 的选择

如果你是在模板参数列表中声明类型参数,你可以自由选择 class 或 typename,两者没有任何功能上的区别。

template <class T>
void func(T a) {}

template <typename T>
void func(T a) {}

类模板

除了函数模板,C++ 还支持类模板,使类可以处理不同的数据类型。下面是一个简单的类模板的例子,它实现了一个通用的容器类 Box,可以存储任何类型的数据。

格式:

template<class T1, class T2, ..., class Tn> 
class 类模板名
{
 // 类内成员定义
};   

示例

#include <iostream>
using namespace std;

template <class T>
class Box {
private:
    T value;
public:
    Box(T v) : value(v) {}
    void display() const {
        cout << "Box contains: " << value << endl;
    }
};

int main() {
    Box<int> intBox(123);           // 创建存储整数的 Box
    Box<double> doubleBox(3.14);    // 创建存储浮点数的 Box
    Box<string> stringBox("Hello"); // 创建存储字符串的 Box

    intBox.display();      // 输出: Box contains: 123
    doubleBox.display();   // 输出: Box contains: 3.14
    stringBox.display();   // 输出: Box contains: Hello

    return 0;
}

在这个类模板中,class T 表示模板参数 T,可以是任何类型。我们可以创建不同类型的 Box 对象,比如 int, double, 或 string,每个 Box 对象会存储相应类型的数据。

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

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

相关文章

Sublime Text 3 相关设置

打开设置 { “font_size”: 16, // 字体大小 “save_on_focus_lost”: true, // 自动保存 }

射击靶标检测系统源码分享

射击靶标检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

【吊打面试官系列-MySQL面试题】LIKE 声明中的%和_是什么意思?

大家好&#xff0c;我是锋哥。今天分享关于【LIKE 声明中的&#xff05;和_是什么意思&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; LIKE 声明中的&#xff05;和_是什么意思&#xff1f; &#xff05;对应于 0 个或更多字符&#xff0c;_只是 LIKE 语句中的…

Amazon Bedrock 模型微调实践(二):数据准备篇

本博客内容翻译自作者于 2024 年 9 月在亚马逊云科技开发者社区发表的同名博客&#xff1a; “Mastering Amazon Bedrock Custom Models Fine-tuning (Part 2): Data Preparation for Fine-tuning” 亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、…

Leetcode—322. 零钱兑换【中等】(memset(dp,0x3f, sizeof(dp))

2024每日刷题&#xff08;159&#xff09; Leetcode—322. 零钱兑换 算法思想 dp实现代码 class Solution { public:int coinChange(vector<int>& coins, int amount) {int m coins.size();int n amount;int dp[m 1][n 1];memset(dp, 0x3f, sizeof(dp));dp[0][…

Django ORM(多表)

文章目录 前言一、关联关系模型二、一对多写入数据二、多对多写入数据二、跨表查询1.查找test 标签的文章2.查找作者名为 test 的文章及标签 三、跨表删除 前言 表与表之间的关系可分为以下三种&#xff1a; 一对一: 一对一关系表示一个模型的每个实例与另一个模型的每个实例…

【字符函数】strcpy函数(字符串复制函数)+strcat函数(字符串追加)+strcmp函数(字符串比较)【笔记】

1.复制函数--------------strcpy函数 函数使用 char*strcpy&#xff08;char* destination, const char* source&#xff09; strcpy函数用于拷贝字符串&#xff0c;即将一个字符串中的内容拷贝到另一个字符串中&#xff08;会覆盖原字符串内容&#xff09;。它的参数是两个指…

Mysql梳理6——order by排序

目录 6 order by排序 6.1 排序数据 6.2 单列排序 6.3 多行排列 6 order by排序 6.1 排序数据 使用ORDER BY字句排序 ASC&#xff08;ascend&#xff09;:升序DESC(descend):降序 ORDER BY子句在SELECT语句的结尾 6.2 单列排序 如果没有使用排序操作&#xff0c;默认…

【HarmonyOS NEXT】DevEco快速实现真机截屏,并保存到电脑

点日志点照机图标选一个路径保存图片在ide中右键图片&#xff0c;点复制电脑随便找个位置保存图片https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/ide-screenshot-V5

1-2.Jetpack 之 Navigation 跳转编码模板

一、Navigation 1、Navigation 概述 Navigation 是 Jetpack 中的一个重要成员&#xff0c;它主要是结合导航图&#xff08;Navigation Graph&#xff09;来控制和简化 Fragment 之间的导航&#xff0c;即往哪里走&#xff0c;该怎么走 2、Navigate 引入 在模块级 build.gra…

Datawhale------Tiny-universe学习笔记——Qwen(1)

1. Qwen整体介绍 对于一个完全没接触过大模型的小白来说&#xff0c;猛一听这个名字首先会一懵&#xff1a;Qwen是啥。这里首先解答一下这个问题。下面是官网给出介绍&#xff1a;Qwen是阿里巴巴集团Qwen团队研发的大语言模型和大型多模态模型系列。其实随着大模型领域的发展&a…

全同台加密综述

文章目录 一、FHE的定义与性质1、核心算法2、性质 二、构造思想三、全同态加密研究进展1、支持部分同态的 Pre-FHE 方案2、基于理想格的 第1代 FHE方案3、基于LWE的 第2代 FHE方案3、基于近似特征向量的 第3代 FHE方案4、支持浮点数运算的 第4代 FHE方案5、其他 FHE方案5.1、基…

数字化时代,住宅代理是怎样为企业赋能的?

在数字化时代&#xff0c;企业的发展也面临着转型&#xff0c;一方面是未知的挑战&#xff0c;一方面是不可多得的机遇。如何在全球市场中保持竞争力是企业要认真思考的问题。如果说主动寻找出路太过冒险&#xff0c;那不妨试试内省式的自我管理革新。代理服务器是一种中介服务…

TI DSP下载器XDS100 V2.0无法使用问题

前言 TI DSP下载器XDS100 V2.0用着用着会突然报Error&#xff0c;特别是你想要用Code Composer Studio烧录下载程序的时候 查看设备管理器&#xff0c;发现XDS100 V2.0的设备端口莫名其妙消失了 问了淘宝的厂家&#xff0c;他说TI的开发板信号可能会导致调试器通信信号中断&a…

软件安全最佳实践:首先关注的地方

尽管组织拥有大量可用的工具&#xff0c;但应用程序安全性仍然不足。 最近的数据显示&#xff0c;在过去四到五年中&#xff0c;软件供应链攻击同比增长了 600-700%&#xff0c;超过一半的美国企业在过去 12 个月中遭受过某种形式的软件供应链攻击。 为何应用程序安全工作未…

相亲交易系统源码详解与开发指南

随着互联网技术的发展&#xff0c;越来越多的传统行业开始寻求线上转型&#xff0c;其中就包括婚恋服务。传统的相亲方式已经不能满足现代人快节奏的生活需求&#xff0c;因此&#xff0c;开发一款基于Web的相亲交易系统显得尤为重要开发者h17711347205。本文将详细介绍如何使用…

WEB攻防-JavaWweb项目JWT身份攻击组件安全访问控制

知识点&#xff1a; 1、JavaWeb常见安全及代码逻辑&#xff1b; 2、目录遍历&身份验证&逻辑&JWT&#xff1b; 3、访问控制&安全组件&越权&三方组件&#xff1b; 演示案例&#xff1a; JavaWeb-WebGoat8靶场搭建使用 安全问题-目录遍历&身份认…

Ubuntu20.04 搜索不到任何蓝牙设备

电脑信息 联想扬天YangTianT4900k 问题描述 打开蓝牙之后&#xff0c;一直转圈&#xff0c;搜索不到任何蓝牙设备 排查 dmesg | grep -i blue 有如下错误&#xff1a; Bluetooth: hci0: RTL: unknown IC info, lmp subver 8852, hci rev 000b, hci ver 000b lsusb 芯片型号如…

imo云办公室 Imo_DownLoadUI.php 任意文件下载漏洞复现

0x01 漏洞描述&#xff1a; imo云办公室由上海易睦网络科技有限公司于2007年创立&#xff0c;总部位于上海&#xff0c;imo云办公室管理运营企业即时通讯平台imo&#xff0c;包括对imo的在线支持&#xff0c;故障处理&#xff0c;客户服务等&#xff0c;对imo进行持续研发&…

Nexpose 6.6.269 发布下载,新增功能概览

Nexpose 6.6.269 for Linux & Windows - 漏洞扫描 Rapid7 Vulnerability Management, release Sep 11, 2024 请访问原文链接&#xff1a;https://sysin.org/blog/nexpose-6/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.or…