当前位置: 首页 > news >正文

C++模板基础(九)

完美转发与 lambda 表达式模板

void f(int& input)
{std::cout << "void f(int& input)\t" << input << '\n';
}void f(int&& input)
{std::cout << "void f(int&& input)\t" << input << '\n';
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);int x = 3;f(x); //int&f(5); //int&&return a.exec();
}

在这里插入图片描述

void f(int& input)
{std::cout << "void f(int& input)\t" << input << "\n\n";
}void f(int&& input)
{std::cout << "void f(int&& input)\t" << input << "\n\n";
}template<typename T>
void fun(T input)
//void fun(T& input) //无法将int x = 3;从int转换为int&
//void fun(T&& input) //&&是万能引用,右值引用的变量是左值。输出同void fun(T input)
{std::cout << "template<typename T> void fun(T input)\n";f(input);
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);int x = 3;fun(x); //int&fun(5); //参数是int&&类型,但是调用了void f(int& input)return a.exec();
}

在这里插入图片描述

● (C++11) 完美转发: std::forward 函数
– 通常与万能引用结合使用
– 同时处理传入参数是左值或右值的情形

#include<utility>void f(int& input)
{std::cout << "void f(int& input)\t" << input << "\n\n";
}void f(int&& input)
{std::cout << "void f(int&& input)\t" << input << "\n\n";
}template<typename T>
void fun(T&& input)
{std::cout << "template<typename T> void fun(T input)\n";f(std::forward<T>(input)); //完美转发
}
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);int x = 3;fun(x); //int&,调用void f(int& input)fun(5); //int&&,调用void f(int&& input)return a.exec();
}

在这里插入图片描述

void f(int& input)
{std::cout << "void f(int& input)\t" << input << "\n\n";
}void f(int&& input)
{std::cout << "void f(int&& input)\t" << input << "\n\n";
}template<typename T>
void fun(T input)
{std::cout << "template<typename T> void fun(T input)\n";f(std::forward<T>(input)); //完美转发不能处理的情形
}
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);int x = 3;fun(x); //int&,调用void f(int&& input)fun(5); //int&&,调用void f(int&& input)return a.exec();
}

在这里插入图片描述

void f(int& input)
{std::cout << "void f(int& input)\t" << input << "\n\n";
}void f(int&& input)
{std::cout << "void f(int&& input)\t" << input << "\n\n";
}template<typename... T>
void fun(T... inputs)
{std::cout << "template<typename... T> void fun(T... inputs)\n";f(std::forward<T>(inputs)...); //包展开技术
}
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);int x = 3;fun(x); //int&,调用void f(int&& input)fun(5); //int&&,调用void f(int&& input)return a.exec();
}

在这里插入图片描述

void f(int& input)
{std::cout << "void f(int& input)\t" << input << "\n\n";
}void f(int&& input)
{std::cout << "void f(int&& input)\t" << input << "\n\n";
}template<typename... T>
void fun(T&&... inputs) //万能引用参数包
{std::cout << "template<typename... T> void fun(T... inputs)\n";f(std::forward<T>(inputs)...); //包展开技术
}
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);int x = 3;fun(x); //int&,调用void f(int& input)fun(5); //int&&,调用void f(int&& input)return a.exec();
}

在这里插入图片描述
● (C++20) lambda表达式模板

消除歧义与变量模板

struct Str
{const static int internal = 3;
};int p = 5;template<typename T>
void fun()
{//internal是T中的一个具体数据,乘以变量pstd::cout << T::internal*p << '\n';
}int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);fun<Str>();return a.exec();
}

在这里插入图片描述
● 使用 typename 与 template 消除歧义
– 使用 typename 表示一个依赖名称是类型而非静态数据成员

struct Str
{using internal = int;
};template<typename T>
void fun()
{//internal是T中的一个数据类型,p是该类型的一个指针int x = 5;typename T::internal* p = &x; //加上typename表示internal是T中的一个数据类型,消除了歧义Str::internal* ptr = &x; //加上限定名Str消除歧义std::cout << p << '\n' << ptr << '\n';
}
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);fun<Str>();return a.exec();
}

在这里插入图片描述

– 使用 template 表示一个依赖名称是模板
– template 与成员函数模板调用

struct Str
{template<typename T>static void internal(){std::cout << "Str::template<typename T> static void internal()\n";}
};template<typename T>
void fun()
{//T::internal<int>(); //编译器可能认为<是小于运算符。Warning: Use 'template' keyword to treat 'internal' as a dependent template nameT::template internal<int>(); //OK,使用了template消除了歧义
}
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);fun<Str>();return a.exec();
}

在这里插入图片描述

struct Str
{template<typename T>void internal() //非static函数{std::cout << "Str::template<typename T> static void internal()\n";}
};template<typename T>
void fun()
{T obj;//obj.internal<int>(); //编译器可能认为<是小于运算符。Warning: Use 'template' keyword to treat 'internal' as a dependent template nameobj.template internal<int>();  //OK,使用了template消除了歧义
}
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);fun<Str>(); //输出同上return a.exec();
}

● (C++14) 变量模板
– template T pi = (T)3.1415926;

template<typename T>
T pi = (T)3.141592653;int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);std::cout << pi<double> << '\n';std::cout << pi<float> << '\n';std::cout << pi<int> << '\n';return a.exec();
}

在这里插入图片描述

template<typename T, unsigned v>
unsigned MySize = (sizeof(T) == v);int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);std::cout << MySize<float, 4> << '\n';std::cout << MySize<int, 2> << '\n';return a.exec();
}

– 其它形式的变量模板
std::is_same

参考
深蓝学院:C++基础与深度解析
cppreference

相关文章:

C++模板基础(九)

完美转发与 lambda 表达式模板 void f(int& input) {std::cout << "void f(int& input)\t" << input << \n; }void f(int&& input) {std::cout << "void f(int&& input)\t" << input << \n;…...

【剑指 Offer】(1)

文章目录前言一、 数组中重复的数字:fire: 解决方法:dog: 代码二、二维数组中的查找:fire:思路:dog:代码三、替换空格:fire:思路:dog: 代码四、从尾到头打印链表:fire:思路:dog:代码:dog: 代码五、重建二叉树:fire:思路:dog: 代码总结前言 剑指offer系列是一本非常著名的面试题…...

每日一题 leetcode1026 2023-4-18

1026. 节点与其祖先之间的最大差值 力扣题目链接 给定二叉树的根节点 root&#xff0c;找出存在于 不同 节点 A 和 B 之间的最大值 V&#xff0c;其中 V |A.val - B.val|&#xff0c;且 A 是 B 的祖先。 &#xff08;如果 A 的任何子节点之一为 B&#xff0c;或者 A 的任何…...

【Python_Scrapy学习笔记(十二)】基于Scrapy框架实现POST请求爬虫

基于Scrapy框架实现POST请求爬虫 前言 本文中介绍 如何基于 Scrapy 框架实现 POST 请求爬虫&#xff0c;并以抓取指定城市的 KFC 门店信息为例进行展示 正文 1、Scrapy框架处理POST请求方法 Scrapy框架 提供了 FormRequest() 方法来发送 POST 请求&#xff1b; FormReques…...

《花雕学AI》02:人工智能挺麻利,十分钟就为我写了一篇长长的故事

ChatGPT最近火爆全网&#xff0c;上线短短两个多月&#xff0c;活跃用户就过亿了&#xff0c;刷新了历史最火应用记录&#xff0c;网上几乎每天也都是ChatGPT各种消息。国内用户由于无法直接访问ChatGPT&#xff0c;所以大部分用户都无缘体验。不过呢&#xff0c;前段时间微软正…...

做程序员累了想要转行?我想给大家分享一下看法

今天早上起床时&#xff0c;我看到有粉丝评论说关于程序员的话题&#xff0c;如果做着觉得累了&#xff0c;就会觉得自己不适合这个工作&#xff0c;想转行。我想给大家分享一下我的看法。 在我刚开始工作时&#xff0c;有人说我不适合做这个工作&#xff0c;但是我坚持了下来…...

如果你想从事人工智能职业,学习Python吧

人工智能并不会抢走你的工作&#xff0c;至少目前还不会。人工智能和机器学习&#xff08;AI/ML&#xff09;最好的应用是补充人类的创造力&#xff0c;而不是取代它。具有讽刺意味的是&#xff0c;最好的大型语言模型&#xff08;LLMs&#xff09;可能是通过使用受版权保护的人…...

百模大战,谁是下一个ChatGPT?

“不敢下手&#xff0c;现在中国还没跑出来一家绝对有优势的大模型&#xff0c;上层应用没法投&#xff0c;担心押错宝。”投资人Jucy&#xff08;化名&#xff09;向光锥智能表示&#xff0c;AI项目看得多、投的少是这段时间的VC常态。 ChatGPT点燃AI大爆炸2个月中&#xff0…...

Revit中怎么绘制多面坡度的屋顶及生成墙

​一、Revit中怎么绘制多面坡度的屋顶 像这种坡屋顶我们可以观察到&#xff0c;它的屋顶轮廓都是带有坡度的&#xff0c;那我可以通过添加定义坡度的方式来绘制出该屋顶。 点击建筑选项卡中的屋顶按钮&#xff0c;选择迹线屋顶。 选择使用拾取线工具&#xff0c;在选项栏中将偏…...

【jvm系列-07】深入理解执行引擎,解释器、JIT即时编译器

JVM系列整体栏目 内容链接地址【一】初识虚拟机与java虚拟机https://blog.csdn.net/zhenghuishengq/article/details/129544460【二】jvm的类加载子系统以及jclasslib的基本使用https://blog.csdn.net/zhenghuishengq/article/details/129610963【三】运行时私有区域之虚拟机栈…...

【GCU体验】基于PaddlePaddle + GCU跑通模型并测试GCU性能

一、环境 地址&#xff1a;启智社区:https://openi.pcl.ac.cn/ 二、计算卡介绍 云燧T20是基于邃思2.0芯片打造的面向数据中心的第二代人工智能训练加速卡&#xff0c;具有模型覆盖面广、性能强、软件生态开放等特点&#xff0c;可支持多种人工智能训练场景。同时具备灵活的可…...

解析hash(散列)数据结构

前言 在学习完map、set这两个由红黑树构成的容器后&#xff0c;我们来到了这里hash&#xff0c;首先我们要有一个基础的认知——哈希和map与set的仅在使用时的差别区别&#xff1a;前者内部的元素没有序&#xff0c;而后者有序&#xff0c;其它的都相同&#xff0c;这里我们可…...

《2023金融科技·校园招聘白皮书》新鲜出炉|牛客独家

数智创新时代&#xff0c;科技人才为先。 眼下&#xff0c;在建设“数字中国”的时代背景下&#xff0c;金融行业全面数智化转型已箭在弦上。政策端&#xff0c;金融行业为中共中央、国务院印发《数字中国建设整体布局规划》的7大重点行业之一。 资本端&#xff0c;仅2022年三…...

文明的标志:书写系统、修建城市、使用金属器

文章目录 引言I 预备知识1.1 文明”和“文化”概念1.2 文明的标志1.3 应对水患II 定居开启了人类文明2.1 书写系统2.2 陶器2.3 家畜引言 一切和开启文明相关的技术都是围绕着两根主线展开: 多获取能量,以便于生存,信息能够管理起酋邦,总结、记录并传授经验。I 预备知识 1.…...

算法:将一个数组旋转k步

题目 输入一个数组如 [1,2,3,4,5,6,7]&#xff0c;输出旋转 k 步后的数组。 旋转 1 步&#xff1a;就是把尾部的 7 放在数组头部前面&#xff0c;也就是 [7,1,2,3,4,5,6]旋转 2 步&#xff1a;就是把尾部的 6 放在数组头部前面&#xff0c;也就是 [6,7,1,2,3,4,5]… 思路 思…...

使用大华惠智双目半球网络摄像机DH-IPC-HD4140X-E2获取人流量统计数据

记录一下使用Java的SpringBoot大华SDK在智慧公厕项目中使大华惠智双目半球网络摄像机DH-IPC-HD4140X-E2获取人流量统计数据 首先根据说明书登录摄像头&#xff0c;一般摄像头都有自己的账号和密码(可能是admin admin 也可能是admin 888888 还有可能是admin 12345)&#xff0c;…...

DC插装式流量阀压力阀

Cartridge Valves 电磁阀 止回阀 运动控制阀 流量控制阀 溢流阀 压力控制阀 顺序阀 梭阀 方向阀 配件 Zero Profile Valves 止回阀 运动控制阀 流量控制阀 溢流阀 梭阀 In-Line Valves 止回阀和梭阀 方向阀 配件 微型系列 AB20S APIDC-30S C10B C10S C10S…...

NumPy 数组学习手册:6~7

原文&#xff1a;Learning NumPy Array 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 六、性能分析&#xff0c;调试和测试 分析&#xff0c;调试和测试是开发过程的组成部分。 您可能熟悉单元测试的概念。 单元测试是程序员编写的用于测试其代码的自动测试。 例如&…...

【笔试强训选择题】Day6.习题(错题)解析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、Day6习题&#xff08;错题&#xff09;解析 二、Day6习题&#xff08;原题&#xff09;练习 总结 前言 一、Day6习题&#xff08;错题&#xff09;解析…...

磁盘分区-LINUX

1、主分区&#xff08;primary&#xff09; 磁盘在Linux当中的命名&#xff1a; IDE /dev/hda hdb SCSI sda sdb 分区数字表示&#xff1a;sda1 、sda2、sda3 磁盘分区相当于给磁盘打隔断 ① 系统中必须要存在的分区&#xff0c;系统盘选择主分区安装 ② 数字编号只能是1-4&am…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

MySQL 主从同步异常处理

阅读原文&#xff1a;https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主&#xff0c;遇到的这个错误&#xff1a; Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一&#xff0c;通常表示&#xff…...

9-Oracle 23 ai Vector Search 特性 知识准备

很多小伙伴是不是参加了 免费认证课程&#xff08;限时至2025/5/15&#xff09; Oracle AI Vector Search 1Z0-184-25考试&#xff0c;都顺利拿到certified了没。 各行各业的AI 大模型的到来&#xff0c;传统的数据库中的SQL还能不能打&#xff0c;结构化和非结构的话数据如何和…...