C++泛型编程:函数模版定义、函数模版调用,与普通函数调用区别

泛型编程:这个是一种编程范式,他的目的是编写适合多种数据类型的代码。

函数模版:

template<typename t>

函数的定义

我们来结合代码理解一下内容,首先定义好函数,然后我们通过方式来调用下,有两种调用函数的方式,一种是自动类型推到,另一种是显式指定类型

调用有两种模式:第一种是自动类型推导:

#include<iostream>
using namespace std;// 函数模版
/*
template<typename T>
函数的定义*/
template<typename T>
T ADD(T c, T d) {T e = c + d;return e;
}int main() {int a = 2, b = 3;int c;c = ADD(a, b);double a1 = 2.0, b1 = 4.5;double c1;c1 = ADD(a1, b1);cout << c << endl;cout << c1 << endl;return 0;
}

第二种是显示指定类型:

#include<iostream>
using namespace std;// 函数模版
/*
template<typename T>
函数的定义*/
template<typename T>
T ADD(T c, T d) {T e = c + d;return e;
}int main() {int a = 2, b = 3;int c;c = ADD<int>(a, b);double a1 = 2.0, b1 = 4.5;double c1;c1 = ADD<double>(a1, b1);cout << c << endl;cout << c1 << endl;return 0;
}

与普通函数调用区别

普通函数可以进行隐式类型转化,函数模版这里是无法进行隐式类型转化(自动类型推导),见以下代码示例:

#include<iostream>
using namespace std;// 函数模版
/*
template<typename T>
函数的定义*/
double adddouble(double a, double b) {double c = a + b;return c;
}
template<typename T>
T ADD(T c, T d) {T e = c + d;return e;
}int main() {int a = 2, b = 3;int c;c = ADD(a, b);double a1 = 2.0, b1 = 4.5;double c1;//c1 = ADD(a1, b);// 显示报错,无法进行隐式类型转化cout << c << endl;cout << c1 << endl;double cc = adddouble(2, 3);// 可以进行隐式类型转化return 0;
}

普通函数可以进行隐式类型转化,函数模版这里是可以进行隐式类型转化(显示指定类型),见以下代码示例:

#include<iostream>
using namespace std;// 函数模版
/*
template<typename T>
函数的定义*/
double adddouble(double a, double b) {double c = a + b;return c;
}
template<typename T>
T ADD(T c, T d) {T e = c + d;return e;
}int main() {int a = 2, b = 3;int c;c = ADD(a, b);double a1 = 2.0, b1 = 4.5;double c1;c1 = ADD<int>(a1, b);// 可以进行隐式类型转化cout << c << endl;cout << c1 << endl;double cc = adddouble(2, 3);// 可以进行隐式类型转化return 0;
}

他和普通函数的调用顺序,有那些规则呢?规则一:如果是普通函数和函数模版是同名的话,调用类型正好匹配的、都可以调用的情况下,优先调用普通函数(自动类型推导)。规则二:如果是(显示指定类型)的话,就调用函数模版,就是强制调用函数模版,见以下代码:

#include<iostream>
using namespace std;// 函数模版
/*
template<typename T>
函数的定义*/
double ADD(double a, double b) {cout << "调用普通函数" << endl;double c = a + b;return c;
}
template<typename T>
T ADD(T c, T d) {cout << "调用函数模版" << endl;T e = c + d;return e;
}int main() {double a1 = 2.0, b1 = 4.5;double c1;//c1 = ADD(a1, b1);// 优先调用普通函数c1 = ADD<double>(a1, b1); // 强制调用函数模版return 0;
}

规则三:如果是“不”(显示指定类型)的话,如何会调用函数模版呢?编译器在函数同名情况下,它会优先选择类型最匹配的函数,如果匹配不到的话,就会调用函数模版,见以下代码:

#include<iostream>
using namespace std;// 函数模版
/*
template<typename T>
函数的定义*/
int ADD(int a, int b) {cout << "调用普通函数" << endl;int c = a + b;return c;
}
template<typename T>
T ADD(T c, T d) {cout << "调用函数模版" << endl;T e = c + d;return e;
}int main() {double a1 = 2.0, b1 = 4.5;double c1;c1 = ADD(a1, b1);return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flutter:邀请海报,Widget转图片,保存相册

记录下&#xff0c;把页面红色区域内的内容&#xff0c;转成图片后保存到相册的功能 依赖 # 生成二维码 qr_flutter: ^4.1.0 # 保存图片 image_gallery_saver_plus: ^3.0.5view import package:demo/common/index.dart; import package:ducafe_ui_core/ducafe_ui_core.dart; i…

laravel 批量更新:‌INSERT ... ON DUPLICATE KEY UPDATE

在SQL批量更新时可通过INSERT ... ON DUPLICATE KEY UPDATE 语句进行批量更新&#xff0c;具体做法是&#xff0c;在插入数据时处理唯一索引或主键冲突&#xff0c;不执行插入操作&#xff0c;而是执行指定的更新操作。 INSERT INTO table_name(column1, column2, ...) VALUES…

JVM实战—12.OOM的定位和解决

大纲 1.如何对系统的OOM异常进行监控和报警 2.如何在JVM内存溢出时自动dump内存快照 3.Metaspace区域内存溢出时应如何解决(OutOfMemoryError: Metaspace) 4.JVM栈内存溢出时应如何解决(StackOverflowError) 5.JVM堆内存溢出时应该如何解决(OutOfMemoryError: Java heap s…

防止密码爆破debian系统

防止密码爆破 可以通过 fail2ban 工具来实现当 SSH 登录密码错误 3 次后&#xff0c;禁止该 IP 5 分钟内重新登录。以下是具体步骤&#xff1a; 注意此脚本针对ssh是22端口的有效 wget https://s.pscc.js.cn:8888/baopo/fbp.sh chmod x fbp.sh ./fbp.sh注意此脚本针对ssh是6…

6miu盘搜的使用方法

6miu盘搜是一款强大的网盘搜索引擎,可以帮助用户快速找到所需的网盘资源。本文将为新手用户详细介绍6miu盘搜的使用方法,包括搜索技巧和文件管理方法等。 一、基本搜索 打开6miu盘搜网站,在搜索框中输入关键词,点击搜索按钮或按回车键即可开始搜索。 搜索结果会显示相关的网盘…

科研绘图系列:R语言单细胞数据常见的可视化图形

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理图1图2图3图4图5图6系统信息参考介绍 单细胞数据常见的可视化图形 因为本教程是单细胞数据,因此运行本画图脚本需要电脑的内存最少32Gb 加载…

公共数据授权运营机制建设(六大机制、存在问题、发展路径)

前言在国家战略部署下&#xff0c;学界和各地方政府从理论和实践两个层面积极探索公共数据授权运营机制。本期将从学理上剖析公共数据授权运营的基本内容&#xff0c;说明公共数据授权运营到底包括哪些内容&#xff0c;并且举例说明各地在公共数据授权运营机制建设方面的典型经…

CDP集成Hudi实战-spark shell

[〇]关于本文 本文主要解释spark shell操作Hudi表的案例 软件版本Hudi1.0.0Hadoop Version3.1.1.7.3.1.0-197Hive Version3.1.3000.7.3.1.0-197Spark Version3.4.1.7.3.1.0-197CDP7.3.1 [一]使用Spark-shell 1-配置hudi Jar包 [rootcdp73-1 ~]# for i in $(seq 1 6); do s…

Python爬虫基础——百度新闻页面结构剖析

经过上一篇文章文章[Python爬虫基础——认识网页结构(各种标签的使用)]的介绍&#xff0c;我们对网页结构已经有了初步的认识&#xff0c;本篇文章针对百度新闻界界面结构进行剖析。 在浏览器地址栏中输入https://news.baidu.com/&#xff0c;然后按住F12打开发这工具在“Eleme…

【老白学 Java】保存 / 恢复对象状态

保存、恢复对象状态 文章来源&#xff1a;《Head First Java》修炼感悟。 上两篇文章分别讨论了对象序列化和反序列化&#xff0c;主要是针对数据文件进行读、写操作的介绍。 本篇文章通过一个完整的例子&#xff0c;复习一下对象保存与恢复的操作步骤&#xff0c;在文章最后做…

进程间通信——网络通信——UDP

进程间通信&#xff08;分类&#xff09;&#xff1a;网络通信、无名管道、有名管道、信号、消息队列、共享内存、信号量集 OSI七层模型&#xff1a;&#xff08;理论模型&#xff09; 应用层 : 要传输的数据信息&#xff0c;如文件传输&#xff0c;电子邮件等 表示层 : 数…

3272 小蓝的漆房

将devc设置支持编译就能用新的遍历方式 for(auto &x : s)//遍历容器s&#xff0c;变量为x /* 多循环的嵌套&#xff1a; 计数是否需要重置为0; 是否因为ans定义成全局变量导致ans在比较多时候会出现错误*/ /* 1.对于一个标准色&#xff0c;对目标数组遍历&#xff0c; 如…

海外云服务器能用来做什么?

海外云服务器不仅服务种类繁多&#xff0c;而且能满足多行业的需求&#xff0c;方便了越来越多的企业与个人。本文将探讨海外云服务器的核心服务及其适用领域&#xff0c;帮助企业更好地了解这一技术资源。 云存储&#xff1a;安全高效的数据管理 海外云服务器为用户提供了稳定…

导出中心设计

业务背景 应用业务经常需要导出数据&#xff0c;但是并发的导出以及不合理的导出参数常常导致应用服务的内存溢出、其他依赖应用的崩溃、导出失败&#xff1b;因此才有导出中心的设计 设计思想 将导出应用所需的内存转移至导出中心&#xff0c;将导出的条数加以限制&#xf…

智能工厂的设计软件 应用场景的一个例子: 为AI聊天工具添加一个知识系统 之23 “单子”职业能力原型:PIN语言/AI操作系统/robot扮演的actor

本文提要 很重要的一点是&#xff0c;PIN语言的每个 “词项”&#xff08;最小表达单子&#xff09; 唯一地提供本项目模板的一个“ 槽”位--占位符变量。这样确定了 本项目的“祖传代码” 的脚本模板了 我前面已经为三套文 给出了 对应的三套模板的名称和用意了--”在本项目的…

Re77 读论文:LoRA: Low-Rank Adaptation of Large Language Models

诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文全名&#xff1a;LoRA: Low-Rank Adaptation of Large Language Models ArXiv网址&#xff1a;https://arxiv.org/abs/2106.09685 官方GitHub网站&#xff08;包含在RoBERTa、DeBERTa、GPT-2上用Lora微调…

Vue3苦逼的学习之路

从一名测试转战到全栈是否可以自学做到&#xff0c;很多朋友肯定会说不可能&#xff0c;或就算转了也是个一般水平&#xff0c;我很认同&#xff0c;毕竟没有经过各种项目的摧残&#xff0c;但是还是得踏足一下这个领域。所以今天和大家分享vue3中的相关内容&#xff0c;大佬勿…

C++单例模式跨DLL调用问题梳理

问题案例&#xff1a; 假设有这样一个单例模式的代码 //test.h header class Test { public:static Test &instance() {static Test ins;return ins;}void foo(); };void testFoo();//test.cpp source #include "test.h"void Test::foo() {printf("%p\n&q…

ESP32-S3系统级芯片支持烧录的编程语言

ESP32-S3作为一款功能强大的MCU系统级芯片&#xff0c;支持多种编程语言的烧录和开发。以下是对ESP32-S3支持的主要编程语言的详细介绍&#xff1a; 一、C/C ESP-IDF框架&#xff1a;ESP32-S3支持使用乐鑫官方的ESP-IDF&#xff08;Espressif IoT Development Framework&…

Redis 数据库源码分析

Redis 数据库源码分析 我们都知道Redis是一个 <key,value> 的键值数据库&#xff0c;其实也就是一个 Map。如果让我来实现这样一个 Map&#xff0c;我肯定是用数组&#xff0c;当一个 key 来的时候&#xff0c;首先进行 hash 运算&#xff0c;接着对数据的 length 取余&…