C++高级特性:可变长模板参数和折叠表达式(八)

1、可变长参数模板
  • 可变长参数是C++类模板编程中非常重要的一个东西,也是C++11引入的新特性,通过使用…来表示参数长度不固定

  • 可以通过sizeof…(args)获取传入参数的个数数量

  • &&表示万能引用,需要注意的是如果不使用万能引用,传入参数的类型需要注意是左值还是右值,要与模板的参数类型匹配。

// 1. 类模板
template<class... T>
class A {
public:A(const T&... args){}
};// 2. 函数模板
template<class...Args>
int func1(Args&&...args)
{return sizeof...(args);
}// 3. 可变参数构造tuple
template<class...Args>
auto return_tuple(Args&&... args)
{return std::make_tuple(args...);
}// 4. 可变参数构造array
template<class...Args>
auto return_array(const Args&... args)
{return std::array{args...};
}void test()
{A<int, std::string, int, bool> a(1, "abc", 4, false);std::cout << "参数个数: " << func1("1", 2, a, 'c', 1.5f) << std::endl;                // 输出5auto t = return_tuple("1", 2, false, 3.14);std::cout << std::get<3>(t) << std::endl;                       // 输出3.14for(auto& x: return_array(1, 3, 4, 6)){                         // 输出1 3 4 6std::cout << x << " ";}std::cout << std::endl;
}
2、可变长参数与完美转发
  • 首先定义了一个类写出构造、拷贝构造和移动构造以及析构函数
  • 然后写一个func函数,其中接收三个参数
  • 最后写一个模板函数,对收到的函数和参数进行完美转发后绑定,最后执行绑定后的函数。
class Test{
public:int* m;Test() {m = new int(5);std::cout << "Test()" << std::endl;}Test(const Test& t){m = new int(*t.m);std::cout << "Test(const Test& t)" << std::endl;}Test(Test&& t) noexcept {m = t.m;t.m = nullptr;std::cout << "Test(Test&& t)" << std::endl;}virtual ~Test(){std::cout << "~Test()" << std::endl;}
};void func(int& a, int b, Test& test)
{std::cout << "func::a = " << a << std::endl;a = 123;b = 456;
}
template<class Func, class...Args>
void test(Func&& func, Args&&... args)
{auto f = std::bind(std::forward<Func>(func), std::forward<Args>(args)...);f();
}void test_func()
{{int a = 5;Test t;test(func, std::ref(a), 5, std::move(t));std::cout << "main::a = " << a << std::endl;}std::cout << __func__ << std::endl;
}/*
Test()
Test(Test&& t)
func::a = 5
~Test()
main::a = 123
~Test()
test_func
*/
3、折叠表达式
void print1(){std::cout << ", 函数递归调用出口";
}
template<class T, class...Args>
void print1(const T& t, Args&&... args)
{std::cout << t << " ";print1(std::forward<Args>(args)...);
}void test_expr()
{print("你好", 3.14159, 123, 'c', 111);
}
/*
你好 3.14159 123 c 111 , 函数递归调用出口
*/

C++11之后写这种模板函数的递归需要写一个空参函数和const T&t参数,而在C++17之后可以折叠表达式展开。

// 折叠表达式
template<class...Args>
void print2(Args&&... args)
{((std::cout << args << " "), ...);
}//或者下面这种写法,都是C++17提供的
template<class T, class...Args>
void print3(const T& t, Args&&... args)
{std::cout << t << " ";if constexpr (sizeof...(args)){print3(args...);}
}

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

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

相关文章

JVM基础面试题第一篇

目录 内存区域面试与分析 1.运行时数据区是什么 2.Java虚拟机栈的作用 3.本地方法栈的作用 4.堆的作用 5.方法区作用 6.运行时常量池的作用 7.直接内存是什么 8.内存溢出和内存泄漏的区别 9.栈溢出的原因 10.方法区溢出的原因 垃圾回收器与内存分配策略-面试与分析 …

LeetCode 49.字母异位词分组

目录 题目描述 方法一 思路&#xff1a; 代码&#xff1a; 题目描述 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", &qu…

Http 请求偶发400错误

1. 背景 生产环境偶发400请求错误&#xff0c;发生概率万分之一&#xff0c;异常信息如下&#xff1a; 1&#xff09; 从异常信息可以看到&#xff0c;skywalking的sw8 header解析失效导致异常信息。 2&#xff09; 0x0d0x0a 作为回车换行符号&#xff0c;没有被正确处理&#…

OpenGL:图元

OpenGL的图元 点 GL_POINTS: 将顶点绘制成单个的点 线 GL_LINES:将顶点用于创建线段,2个点成为一条单独的线段。如果顶点个数是奇数,则忽略最后一个。 顶点:v0, v1, v2, v3, … , vn,线段:v0-v1, v2-v3, v4-v5, … , vn-1 - vn GL_LINE_STRIP:将顶点用于创建线段,…

谈谈Python中的分布式计算和大数据处理

谈谈Python中的分布式计算和大数据处理 Python作为一种通用、解释型的高级编程语言&#xff0c;因其简洁易读、强大的库支持和广泛的应用领域&#xff0c;近年来在分布式计算和大数据处理领域也获得了显著的关注和应用。 分布式计算是一种计算方法&#xff0c;它将大型问题划…

学习笔记(4月18日)vector底层模拟实现(1)

1.迭代器 vector实际上是由迭代器进行维护的&#xff0c;关于迭代器是什么&#xff0c;为什么要叫这个名字&#xff0c;后面的学习会逐渐了解&#xff0c;现在先将迭代器是作为指针即可。 vector底层有三个迭代器&#xff0c;用来起到容量、数组头、元素个数的作用。 同时为…

带头节点的单链表练习(写加注释花了5小时,已废)

目录 1.test.c 2.LinList.c 3.LinList.h 1.test.c 单链表的操作 #include "LinList.h" //head->a0(头节点)->a1->...->ai->...->an int main() {SLNode* head;int i;DataType x, y;ListInitiate(&head);//初始化链表for (i 1; i < 11;…

基于XML配置bean(一)

文章目录 1.获取bean的两种方式1.通过id获取bean&#xff08;前面用过&#xff09;2.通过类型获取bean&#xff08;单例时使用&#xff09;1.案例2.代码1.beans.xml2.SpringBeanTest.java3.结果 3.注意事项 2.三种基本依赖注入方式1.通过属性配置bean&#xff08;前面用过&…

DDoS攻击趋势分析及防御建议:网络安全新挑战与应对策略

在数字化日益普及的今天&#xff0c;网络安全问题日益凸显。其中&#xff0c;分布式拒绝服务&#xff08;DDoS&#xff09;攻击以其巨大的破坏力和难以防范的特性&#xff0c;发起简单、效果显著、难以追踪等特点&#xff0c;因此被黑客广泛使用&#xff0c;已经成为网络安全领…

Python(九十四)变量的作用域

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

CSS 设置空格原样显示 white-space:pre-wrap;

CSS 设置空格原样显示 问题描述 html 渲染内容时&#xff0c;对于 空格、回车、Tab 键的 默认处理方式是 &#xff1a; 无论存在多少个连续的空格&#xff0c;都只会保留一个。 结论 由于以上的特性&#xff0c;导致了我们无法直接渲染出原格式的文本。pre 标签 了解一下 &…

element-plus中的图标和文字水平对齐

<span><el-icon size"14px"><Delete /></el-icon> <span>删除</span> </span>解决方法&#xff1a;加上vertical-align: middle样式就可以了 <span><el-icon size"14px" style"vertical-align: …

【STM32CubeIDE 1.15.0】汉化包带路径配置过程

一、IDE软件下载 二、汉化版包路径 三、IDE软件板载汉化包 一、IDE软件下载 ST官网IDE下载链接 二、汉化版包路径 https://mirrors.ustc.edu.cn/eclipse/technology/babel/update-site/ 找不到就到.cn后面一级一级进 三、IDE软件板载汉化包 https://mirrors.ustc.edu…

数据库工具解析之 OceanBase 数据库导出工具

背景 大多数的数据库都配备了自己研发的导入导出工具&#xff0c;对于不同的使用者来说&#xff0c;这些工具能够发挥不一样的作用。例如&#xff1a;DBA可以使用导数工具进行逻辑备份恢复&#xff0c;开发者可以使用导数工具完成系统间的数据交换。这篇文章主要是为OceanBase…

​波士顿动力发布全新人形机器人:Atlas

4月16日&#xff0c;波士顿动力&#xff08;Boston Dynamics&#xff09;发布了《再见&#xff0c;液压Atlas》视频&#xff0c;正式宣告其研发的液压驱动双足人形机器人Atlas退役。 在视频的结尾&#xff0c;Atlas深深鞠躬&#xff0c;之后还有一句话“直到我们再次相遇&…

第十六届“华中杯”大学生数学建模挑战赛A题思路

A题 太阳能路灯光伏板的朝向设计问题 太阳能路灯由太阳能电池板组件部分(包括支架)、LED 灯头、控制箱(包含控制器、蓄电池)、市电辅助器和灯杆几部分构成。太阳能电池板通过支架固定在灯杆上端。太阳能电池板也叫光伏板, 它利用光伏效应接收太阳辐射能并转化为电能输出,…

B1098 岩洞施工

solution #include<iostream> using namespace std; int main(){int n, x, top 1000, down 0;//管道水平放入>顶部最低点和底部最高点之间的距离就是能够承担的最大宽度scanf("%d", &n);for(int i 0; i < n; i){scanf("%d", &x);i…

3D模型处理的多进程并行【Python】

今天我们将讨论如何使用 Python 多进程来处理大量3D数据。 我将讲述一些可能在手册中找到的一般信息&#xff0c;并分享我发现的一些小技巧&#xff0c;例如将 tqdm 与多处理 imap 结合使用以及并行处理存档。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生…

SHELL编程----Nginx日志分析2-统计某个时间段的IP访问量

描述 假设 Nginx 的日志存储在 nowcoder.txt 里&#xff0c;内容如下&#xff1a; 192.168.1.20 - - [21/Apr/2020:14:27:49 0800] "GET /1/index.php HTTP/1.1" 404 490 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 F…

AI论文速读 | 2024[VLDB]TFB:全面与公正的时间序列预测方法基准测试研究

论文标题&#xff1a;TFB: Towards Comprehensive and Fair Benchmarking of Time Series Forecasting Methods 作者&#xff1a;Xiangfei Qiu ; Jilin Hu&#xff08;胡吉林&#xff09; ; Lekui Zhou ; Xingjian Wu ; Junyang Du ; Buang Zhang ; Chenjuan Guo&#xff08;郭…