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

【C++】可变参数模板简单介绍

前言

可变参数模板是C++11中的新特性,它能够让我们创建可以接收可变参数的函数模板和类模板,相比C++98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数是一个巨大的改进,通过系统系统推演数据的类型,不用自己写出模板参数类型。

下面我们来创建一个基本的的能够接收可变参数的函数模板:

template<class ...Args>
void ShowFunc(Args... args)
{
}

声明一个参数包Args... args,这个参数包中可以包含0到任意个模板参数。

上面代码中Args是一个模板参数包,args是一个函数形参参数包。

#include<iostream>
#include<string>
using namespace std;
template<class ...Args>
void ShowFunc(Args... args)
{cout << sizeof...(args) << endl;
}
int main()
{ShowFunc(1);ShowFunc(1, 1.1);ShowFunc(1, 1.1, 'A', std::string("sort"));return 0;
}

sizeof...(args)是计算该函数中含有多少个参数,即计算函数形参的个数。

下面我们来看一下如何使用可变参数的函数模板获取其参数包的值。

方法一:编译器编译时的递归推演:第一个模板参数依次解析获取参数包中的参数值。

#include<iostream>
#include<string>
using namespace std;// 递归终止函数
template <class T>
void ShowFunc(const T& t)
{cout << t << endl;
}
// 展开函数
template <class T, class ...Args>
void ShowFunc(T value, Args... args)
{cout << value << " ";ShowFunc(args...);
}
int main()
{ShowFunc(1);ShowFunc(1, 1.1);ShowFunc(1, 1.1, 'A', std::string("sort"));return 0;
}

方法二:利用逗号表达式展开参数包:初始化数组arr,强行让编译器解析参数包,参数包有几个参数,PrintArg就自动推演生成相应个。

#include<iostream>
#include<string>
using namespace std;template <class T>
void PrintArg(T t)
{cout << t << " ";
}
//展开函数
template <class ...Args>
void ShowFunc(Args... args)
{int arr[] = { (PrintArg(args), 0)... };cout << endl;
}
int main()
{ShowFunc(1);ShowFunc(1, 'A');ShowFunc(1, 'A', std::string("CSDN"));return 0;
}

 

http://www.lryc.cn/news/348561.html

相关文章:

  • RabbitMQ--死信队列
  • 微信小程序毕业设计-基于Java后端的微信小程序源码150套(附源码+数据库+演示视频+LW)
  • 提前预知职业天赋!霍兰德职业兴趣测试API接口给你精准推荐
  • js强大的运算符:??、??=
  • 【MATLAB源码-第207期】基于matlab的单相光伏并网系统仿真,并网策略采用基于扰动观测法的MPPT模型和使用电压电流双闭环SPWM控制。
  • java发送请求-二次开发-get请求json
  • Typescript高级: 对泛型和多态的应用, 实现Java中的ArrayList和LinkedList
  • 正则表达式常用特殊字符(元字符)说明
  • 使用hdc TCP模式无线方式连接OpenHarmony设备
  • 杂记-记一次前端打包问题解决过程
  • 维修ABB示教器主板DSQC679 3HAC 033624-001 /R机器人液晶显示屏深圳捷达工控维修
  • 原子学习笔记3——点亮 LED
  • 齐护K210系列教程(十八)_识别条码
  • K折交叉验证
  • Docker 的 Ubuntu 操作系统镜像
  • 【Python】Python中的logging模块介绍和示例
  • PXIe规格i3/i5/i7单板计算机控制器
  • 弱网对抗的策略有哪些?
  • 如何通过OMS加快大表迁移至OceanBase
  • 讨论:WGS84与CGCS2000的坐标系怎么互转
  • SpringCloud面试题
  • 深入了解Java Stream中的Collectors.partitioningBy()
  • 下拉多选【bootstrap-multiselect】
  • 建筑(八大员)报考条件
  • _remote.repositories作用
  • 2.3 Spark运行架构与原理
  • redis的跳表
  • 探索未知,开启海外盲盒新纪元——海外盲盒App,你的全球奇遇宝箱
  • LeetCode2215找出两数组的不同
  • Git系列:git show 使用技巧