C++:完美转发和可变参数模板

完美转发和可变参数模板

(1)完美转发

A.What(什么是完美转发)

某些函数将其一个或多个实参连同其类型不变地转发给其它函数,我们需要保证被转发实参的所有性质,这种保证转发实参所有性质的参数传递,我们称之为“完美转发

B.How(如何进行完美转发)

常见的模板函数定义形式如下:一般使用两个引用符来实现完美转发

template <typename F, typename T1, typename T2>
auto flip(F f, T1 &&t1, T2 &&t2)
{return f(t1, t2);
}

假如存在函数func()如下:

int func(int& iVal01, int iVal02)
{return iVal01 + iVal02;
}
int main()
{int iVal = 10;auto res = flip(func, iVal, 30); //res为40return 1;
}

在上述例子中,T1为int& &&,折叠为int& t1,从而实现了完美转发

C. forward()和move()函数介绍

forward() 可以保持给定实参的左值/右值属性

forward<T>(t); //使用方式,保持t的左值或右值属性

move函数将左值转换为右值

std::string str = "Hello, ThreeBody!";
std::string &&ref = std::move(str); //将左值强转为右值

(2)可变参数模板

A.What(什么是可变参数模板)

模板参数的长度可变,以递归的形式来访问传入的参数

void show() // 终止条件 
{ cout << endl; 
}
template <typename T, typename... Args> // Args 为模板参数包,表示 0 个或多个模板参数 
void show(const T &t, const Args &...args) // args 为函数参数包,表示 0 个或多个函数参数
{cout << t << " " << endl; cout << sizeof...(Args) << endl; // 2 1 0 ;sizeof...运算符,返回包中参数的个数 cout << sizeof...(args) << endl; // 2 1 0show(args...); 
}
string zs = "张三"; 
double defict = 128.1; 
int year = 1981;
show(zs, defict, year);

B.包拓展

包拓展就是将可变参数模板分解成构成元素

C.转发参数包

实现可变参数的“完美转发

void show() // 终止条件
{cout << endl; 
}
template <typename T, typename... Args> // Args 为模板参数包,表示 0 个或多个模板参数 
void show(T &&t, Args &&...args) // args 为函数参数包,表示 0 个或多个函数参数
{cout << t << " " << endl; cout << sizeof...(Args) << endl; cout << sizeof...(args) << endl; show(std::forward<Args>(args)...);
}

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

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

相关文章

前端开发知识(二)-css

<head> <style> div{ } </style> </head> div是布局标签&#xff0c; 一般放在head标签内&#xff0c;最下部。 若直接在在.css文件中写css,文件中&#xff0c;直接写就行&#xff0c;如下所示。 div{ }

MySQL数据库安装使用

我们都知道数据库又分为关系型数据库和非关系型数据库&#xff1b; 关系型数据库指采用了关系模型来组织数据的数据库&#xff0c;指的就是二维表格模型。可以先初步理解为Excel表格。非关系型数据库又被称为NoSQL&#xff0c;对NoSQL 最普遍的定义是“非关联型的”&#xff0…

C语言 | Leetcode C语言题解之第279题完全平方数

题目&#xff1a; 题解&#xff1a; // 判断是否为完全平方数 bool isPerfectSquare(int x) {int y sqrt(x);return y * y x; }// 判断是否能表示为 4^k*(8m7) bool checkAnswer4(int x) {while (x % 4 0) {x / 4;}return x % 8 7; }int numSquares(int n) {if (isPerfect…

JAVA零基础小白自学日志——第二十三天

文章目录 1.访问范围权限关键字2.private&#xff08;私有&#xff09;3.default&#xff08;默认&#xff09;4.protected&#xff08;受保护的&#xff09;5.public&#xff08;公共&#xff09; 今日摘要&#xff1a;再谈访问范围 1.访问范围权限关键字 项目同一个类同一个…

Linux环境安装KubeSphere容器云平台并实现远程访问Web UI 界面

文章目录 前言1. 部署KubeSphere2. 本地测试访问3. Linux 安装Cpolar4. 配置KubeSphere公网访问地址5. 公网远程访问KubeSphere6. 固定KubeSphere公网地址 前言 本文主要介绍如何在Linux CentOS搭建KubeSphere并结合Cpolar内网穿透工具&#xff0c;实现远程访问&#xff0c;根…

HTTP请求入参类型解读

HTTP请求入参类型解读 Content-Type 在HTTP请求中&#xff0c;Content-Type请求头用于指示资源的MIME类型&#xff0c;即请求体的媒体类型。它告诉服务器实际发送的数据类型是什么&#xff0c;以便服务器能够正确地解析和处理这些数据。Content-Type可以有多种值&#xff0c;…

服务器怎样减少带宽消耗的问题?

择业在使用服务器的过程中会消耗大量的带宽资源&#xff0c;而减少服务器的带宽消耗则可以帮助企业降低经济成本&#xff0c;同时还能够提高用户的访问速度&#xff0c;那么服务器怎样能减少带宽的消耗呢&#xff1f;本文就来带领大家一起来探讨一下吧&#xff01; 企业可以选择…

详解建造者(builder)模式的创建对象使用方式

目录 抽象类代码导入依赖Pizza类Topping 枚举成员变量内部抽象类 BuilderBuilder 类的成员变量addTopping 方法&#xff1a;build 方法&#xff1a;self 方法&#xff1a;Pizza 类的构造函数&#xff1a; 实现类代码1. 导入Objects类2. NyPizza类3. Calzone类递归泛型类型stati…

C++ 类型转换 包括C风格的转换、static_cast、const_cast、reinterpret_cast、dynamic_cast、模板特化等

C 类型转换 包括C风格的转换、static_cast、const_cast、reinterpret_cast、dynamic_cast、模板特化等 flyfish 0. 隐式转换&#xff08;Implicit Conversions&#xff09; 隐式转换是编译器自动进行的类型转换&#xff0c;通常在需要将一个类型转换为另一个类型以匹配函数参…

kafka架构+原理+源码

1.安装jdk17 sudo yum -y update sudo wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm sudo yum -y install ./jdk-17_linux-x64_bin.rpm、 sudo java -version 2.安装kafka How to easily install kafka without zookeeper | Aditya’s Blog …

负载均衡工具haproxy完整安装部署流程 及 haproxy通过域名匹配进行负载-基于域名负载均衡的Haproxy配置

一、负载均衡工具haproxy完整安装部署流程 1. 关于负载均衡和haproxy 负载均衡是系统设计最常见的一种方式&#xff0c;Nginx、HAProxy、LVS、F5用得比较普遍&#xff0c;不过Nginx只能在HTTP层负载&#xff0c;而HAProxy即可以在7层做负载&#xff0c;也可以在4层做负载&…

一文了解AOL算子加速库

过去一年&#xff0c;随着ChatGPT的发布与快速迭代&#xff0c;基于大数据量、大参数量、大算力的预训练大模型已成为人工智能产业的主要路线。大模型的普及与发展不仅依靠模型本身的创新&#xff0c;更依赖于算力底座的支撑以及软件生态的繁荣&#xff0c;需要伙伴和开发者的积…

Vue3逻辑复用及内置组件

Vue3的逻辑复用主要通过“组合式函数”、“自定义指令”及“插件”来实现。提高了代码复用性&#xff0c;增强代码可维护性及促进团队合作。 1 逻辑复用 1.1 组合式函数 利用Vue组合式API来封装和复用有状态逻辑的函数。对组合式函数有如下约定&#xff1a; 命名&#xff0…

Sentinel限流规则详解

上一期教程讲解了 Sentinel 的快速入门&#xff1a;Sentinel快速入门&#xff0c;这一期主要讲述 Sentinel 的限流规则 簇点链路 簇点链路就是项目内的调用链路&#xff08;Controller -> Service -> Mapper&#xff09;&#xff0c;链路中被监控的每个接口就是一个资源…

wkhtmltopdf 工具安装与使用

前情提要&#xff1a; 最近一个同事请叫我一个问题&#xff0c;他发现一片不错的博文&#xff0c;是在博客园的&#xff0c;但是不能下载这篇文章&#xff0c;我看了一下才发现&#xff0c;原来csdn也是不行的。合理。毕竟是人家辛苦写的文章&#xff0c;不能就这么被别人随便c…

动态多态——java

多态&#xff08;Polymorphism&#xff09;是面向对象编程&#xff08;OOP&#xff09;的一个核心概念&#xff0c;它允许一个接口被多个类实现&#xff0c;从而使得一个方法调用可以根据对象的实际类型表现出不同的行为。多态性提高了代码的灵活性和可扩展性。 多态的类型 编译…

机器学习中的预测:真的是预测吗?

预测 机器学习中的预测&#xff1a;真的是预测吗&#xff1f;预测的定义为什么预测需要X&#xff1f;传统预测与机器学习预测的对比未来的预测模型&#xff1a;向自动生成输入的方向发展结论 机器学习中的预测&#xff1a;真的是预测吗&#xff1f; 在探讨机器学习中的“预测”…

《Java初阶数据结构》----7.<优先级队列PriorityQueue>

前言 大家好&#xff0c;我目前在学习java。之前也学了一段时间&#xff0c;但是没有发布博客。时间过的真的很快。我会利用好这个暑假&#xff0c;来复习之前学过的内容&#xff0c;并整理好之前写过的博客进行发布。如果博客中有错误或者没有读懂的地方。热烈欢迎大家在评论区…

[渗透测试] 主动信息收集

主动信息收集 在红蓝对抗过程中&#xff0c;资产属于核心地位&#xff0c;攻击方&#xff08;红方&#xff09;要尽可能的去获取对方资产&#xff0c;暴露目标资产&#xff0c;包括IP地址、网络设备、安全设备、服务器、存储在服务器中的数据等。防守方也要清楚自己有多少有价…

宝塔SSL续签失败

我有2个网站a和b&#xff08;文字中用baidu.com替换我的域名&#xff09; b是要续签那个&#xff0c;但续签报错&#xff1a; nginx version: nginx/1.22.1 nginx: [emerg] host not found in upstream "github.com" in /www/server/panel/vhost/nginx/proxy/a.bai…