C++模板函数
C++模板函数
- 函数模板
- 简单的函数模板
- 模板类型推导
- 返回输入的类型,模板返回的类型由输入的决定
- 返回类型的模板参数
- 返回值使用auto,编译器自动推导
- 默认模板实参
- 模板参数
- 重载函数模板
- constexpr关键字
函数模板
简单的函数模板
typename 可以使用class代替,但是不可以是使用struct代替。
template <typename T>
T mmax(T a, T b)
{return b < a ? a : b;
}
模板类型推导
返回输入的类型,模板返回的类型由输入的决定
template <typename T>
T mmax(T a, T b)
{return b < a ? a : b;
}
T是由输入的参数类型推导出来的,输入int T就是int型的。
如果a 和 b一个是int一个是double就需要定义两个typename。
template <typename T1, typename T2>
T1 mmax(T1 a, T2 b)
{return b < a ? a : b;
}
返回类型的模板参数
当模板参数和调用参数之间没有关联的时候,且模板参数不确定的时候,必须在调用时显式指定模板实参。
添加三个模板类型,调用的时候必须指定模板的返回类型
template <typename TR, typename T1, typename T2>
TR mmax(T1 a, T2 b)
{return b < a ? a : b;
}std::cout << mmax<int>(10.3,6)<< endl;
返回值使用auto,编译器自动推导
从C++14开始,可以通过不声明任何返回类型来实现。
template <typename T1, typename T2>
auto mmax(T1 a, T2 b) -> typename std::decay<decltype(b < a ? a : b)>::type
{return b < a ? a : b;
}
这里使用了类型特征 std::decay<>,其返回结果类型为成员type 。 std::decay<>在标准库<type_traits> 中定义。由于其成员type是一个类型,因此必须用typename修饰这个表达式才能访问它。
从C++11,C++标准库提供了一种指定选择“更一般的类型”的方法。std::common_type<>::type 萃取作为模板实参传递的两个或多个不同类型的“公共类型”。
C++11写法
template <typename T1, typename T2>
typename std::common_type<T1, T2>::type mmax(T1 a, T2 b)
{return b < a ? a : b;
}
C++ 14 写法
template <typename T1, typename T2>
std::common_type_t<T1, T2> mmax(T1 a, T2 b)
{return b < a ? a : b;
}
std::common_type<> 也是在标准库<type_traits> 中。
它可以萃取一个具有作为结果类型的type 成员的结构体。
其核心用法:
typename std::common_type<T1, T2>::type
从C++14 开始,可以通过在特征名称后面附加_t 并省略typename 和 ::type
std::common_type_t<T1, T2>
在内部它根据运算符?:的语法规则或具体的类型的特化来选择类型。
默认模板实参
使用三目运算符?: 不过必须在a和b参数调用之前使用。
template <typename T1, typename T2, typename TR = std::decay_t<decltype(true ? T1() : T2())>>
TR mmax(T1 a, T2 b)
{return b < a ? a : b;
}
使用std::common_type<> 类型特征来指定返回类型的默认值:
template <typename T1, typename T2, typename TR = std::common_type_t<T1, T2>>
TR mmax(T1 a, T2 b)
{return b < a ? a : b;
}
需要注意的是,std::common_type<> 会进行退化,因此返回类型不可能变成引用类型。
模板参数
template<typename T, int N>
void Print(T a)
{std::vector<T> num;for(int i = 0; i < N; ++i){num.push_back(i + a);}for(auto& value : num){std::cout << static_cast<T>(value) << std::endl;}
}
重载函数模板
int mmax(int a, int b)
{return b < a? a : b;
}template<typename T>
T mmax(T a, T b)
{return b < a? a : b;
}std::cout << mmax(10.3,6.1)<< endl; //使用的模板函数
一个模板函数可以和一个普通函数同名且可以用相同类型实例化的函数模板共存。在所有其他因素都相同的情况下,重载解析过程优先选择非模板函数。
std::cout << mmax('a', 6) << endl;
由于模板参数推导不允许自动类型转换,而普通函数可以,因此此函数使用的是非模板函数。
template <typename T1, typename T2>
auto mmax(T1 a, T1 b)
{return b < a ? a : b;
}template <typename TR, typename T1, typename T2>
TR mmax(T1 a, T1 b)
{return b < a ? a : b;
}
auto a = mmax<double, int>(10.3, 6);使用第一个模板
auto b = mmax<long, double>(10.3, 6); 使用第二个模板
auto c = mmax<int>(10.3, 6); 错误: 两个模板都能匹配
两个模板都能匹配通常会造成重载解析过程中无从选择,并产生歧义。因此在重载函数模板时,应该确保对于任何调用,其中只有一个与之匹配。
constexpr关键字
从C++11开始,可以使用关键字constexpr来启用在编译器使用代码计算某些数值的功能。
constexpr int Sum(int a, int b)
{return a + b;
}
int Iarray[Sum(10,3)];
使用这个关键字修饰函数就可以自定义数组大小,如果不用这个关键字修饰代码编译会出错的。
相关文章:
C++模板函数
C模板函数 函数模板简单的函数模板模板类型推导返回输入的类型,模板返回的类型由输入的决定返回类型的模板参数返回值使用auto,编译器自动推导 默认模板实参模板参数重载函数模板 constexpr关键字 函数模板 简单的函数模板 typename 可以使用class代替…...
c#中的正则表达式和日期的使用(超全)
在 C# 中,正则表达式(Regular Expressions)是一种强大的文本处理工具,用于执行各种字符串搜索、替换和验证任务。以下是一些常用的正则表达式示例及其用途: 1. 邮箱地址验证 string emailPattern "^[^\s][^…...
论文阅读【检测】:商汤 ICLR2021 | Deformable DETR
文章目录 论文地址AbstractMotivation技术细节多尺度backbone特征MSDeformAttention 小结 论文地址 Deformable DETR 推荐视频:bilibili Abstract DETR消除对目标检测中许多手工设计的组件的需求,同时表现出良好的性能。然而,由于Transfor…...
dpdk发送udp报文
dpdk接收到udp报文后,自己构造一个udp报文,将收到的报文中的源mac,目的mac,源ip,目的ip,源端口和目的端口交换下顺序填充到新的udp报文中,报文中的负载数据和收到的udp保持一致。 注࿱…...
网站后端管理和构建java项目的工具-Maven
maven是用于管理和构建java项目的工具。 管理Jar包 无论是使用eclipse、IDEA创建的maven项目,格式都是统一的。 不同开发工具创建的maven项目兼容。 test是对main测试的代码。main中的resources中放置配置文件。 对于Maven,一个Maven项目就是一个对象…...
深入理解计算机系统 CSAPP 家庭作业11.10
A: //home.html <form action"/cgi-bin/adder" method"GET"><ul><li><label for"n1">n1:</label><input type"text" id"n1" name"n1" /> //name的值决定页面提交后…...
Unity3D 二进制序列化器详解
前言 在Unity3D开发中,二进制序列化是一种重要的数据持久化和网络传输技术。通过二进制序列化,游戏对象或数据结构可以被转换成二进制格式,进而高效地存储于文件中或通过网络传输。本文将详细介绍Unity3D中的二进制序列化技术,包…...
js_拳皇(上)
文章目录 架构设计:一图胜千言绪论不能正常加载动图设计的思路渲染画布开发感想角色抽象为矩形ctx 是 canvas 的对象键盘控制角色Set键盘事件流程图在 canvas 里面使用 gif 图片继承存储动作ReferenceError: gif is not definedTypeError: Cannot read properties o…...
TCP请求如何获取客户端真实源IP地址
应用场景 在基于TCP的应用程序中,获取客户端真实源IP地址可以用于以下应用场景: 访问控制和安全策略:通过获取客户端真实源IP地址,应用程序可以实施访问控制策略,限制或允许特定IP地址的访问。这可以用于身份验证、防…...
【b站-湖科大教书匠】6 应用层 - 计算机网络微课堂
课程地址:【计算机网络微课堂(有字幕无背景音乐版)】 https://www.bilibili.com/video/BV1c4411d7jb/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 6 应用层 6.1 应用层概述 6.2 客户-服务器方式和对等方…...
QT串口和数据库通信
创建串口 串口连接客户端并向服务器发送消息 client.pro #------------------------------------------------- # # Project created by QtCreator 2024-07-02T14:11:20 # #-------------------------------------------------QT core gui network QT core gui…...
WebKitWebKit简介及工作流程
简介 引擎能够解析HTML、CSS、JavaScript等网页标准,从而将互联网内容呈现给用户。 WebKit的主要特点包括: 开源性:它是一个开源项目,任何人都可以查看、修改和贡献代码。跨平台:WebKit可以在多个操作系统上运行&am…...
架构分析(CPU:ARM vs RISC-V)
ARM N2 ARM V2 对比 N2和V2,整体架构具有一致性。保证 SiFive P870 P870 Pipeline Veyron V1...
使用 Docker Compose 部署 RabbitMQ 的一些经验与踩坑记录
前言 RabbitMQ 是一个功能强大的开源消息队列系统,它实现了高效的消息通信和异步处理。 本文主要介绍其基于 Docker-Compose 的部署安装和一些使用的经验。 特点 成熟,稳定消息持久化灵活的消息路由高性能,高可用性,可扩展性高支…...
前端八股速通(持续更新中...)
1、深拷贝和浅拷贝的区别 浅拷贝:浅拷贝是拷贝一层,引用类型共享地址。 如果属性是基本类型,拷贝的就是基本类型的值。 如果属性是引用类型,拷贝的就是内存地址。 意思是,当进行浅拷贝时,对于对象的每一…...
【语音识别和生成】语音识别和语音合成技术
语音识别和生成:语音识别和语音合成技术 目录 引言语音识别技术 语音识别的基本原理语音识别系统的组成语音识别的关键技术 语音合成技术 语音合成的基本原理语音合成系统的组成语音合成的关键技术 语音识别和生成的应用 智能助理智能家居语音翻译医疗健康教育和学…...
Redis#架构师面试题
1、Redis锁存在哪些问题及如何解决? 1、死锁问题 加过期时间设定 2、原子性问题 通过“set…nx...ex…”命令,将加锁、过期命令编排到一起,它们是原子操作了,可以避免死锁。 3、释放其他线程的锁问题 当过期时间设置小于线程…...
关于#define的使用方法总结
文章目录 #define 预处理指令一、#define宏定义二、查看预处理文件三、#define 的使用方法四、C语言宏中“#”和“##”的用法五、常见的宏定义总结六、常考题目 #define 预处理指令 #define 是 C 和 C 编程语言中的预处理指令,用于定义宏(macro…...
Unity顶点动画(Vertex Animation):创造动态视觉效果
在Unity中,顶点动画(Vertex Animation)是一种强大的技术,它允许开发者直接在顶点级别上操作和变形网格,从而实现各种动态视觉效果。顶点动画不依赖于骨骼绑定,因此非常适合模拟布料、流体、面部表情等复杂的动画效果。本文将探讨顶…...
WSL for Windows
1、安装 超详细Windows10/Windows11 子系统(WSL2)安装Ubuntu20.04(带桌面环境)_wsl安装ubuntu20.04-CSDN博客https://blog.csdn.net/weixin_44301630/article/details/122390018 注意,安装之后首次启动 Ubuntu 时&…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
