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

[c++] 可变参数模版

前言

可变参数模板是C++11及之后才开始使用,学校的老古董编译器不一定能用

相信大家在刚入门c/c++时都接触过printf函数

int printf ( const char * format, ... );

printf用于将数据格式化输出到屏幕上,它的参数非常有意思,可以支持任意数量,任意类型的多参数.而如果我们想实现类似这种的传参,在C里似乎并不支持

c++11提出了可变模板参数来解决这一问题

语法

template<class ...Argc>                                // 模板处, 在模板名前加三个点
void test_arcg(Argc... argc) {}                       // 传参处,在模板名后面加三个点

// 模板这块点的位置非常非常怪,很容易记混,如果忘了就换个位置多敲两次


匹配优先级

在模板部分我们了解过,对于一个函数调用来说,如果有非模板的优先匹配非模板的,在匹配模板的,而可变参数的匹配优先级在模板之下,

如果有已经实例化的,优先匹配实例化的,如果有模板的再去匹配模板的,如果实例化和模板的都不匹配,那就匹配可变参数模板


sizeof操作符

sizeof是c/c++内置的一个操作符,在没学可变模板参数之前用来计算一个数据对象所占内存大小,在可变模板参数这里被特化为求可变模板的数据

语法为  sizeof...(args)    ,很怪很怪


访问可变模板参数数据

1.递归式展开

思路:在可变模板参数前加上一个模板,这样的话第一个参数优先匹配模板,在函数体内在递归调用该函数,写一种无参的函数,最后无参数时调用无参的直接跳处函数

void _fun() {return;
}
template<class T, class ...Args >
void _fun(T t, Args ... args) {cout << t << endl;_fun(args...);
}
template<class ...Args>
void fun(Args... args) {_fun(args...);
}int main() {fun(1,"123456",5.5);system("pause");
}

2.逗号表达式型

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

感谢观看

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

相关文章:

  • QWidget窗口抗锯齿圆角的一个实现方案(支持子控件)2
  • 数据结构之“队列”(全方位认识)
  • 密码学复习
  • 【文献解析】一种像素级的激光雷达相机配准方法
  • Http 实现请求body体和响应body体的双向压缩方案
  • C++(Qt)-GIS开发-简易瓦片地图下载器
  • 誉天教育7月开班计划:为梦想插上腾飞的翅膀!
  • STM32基础篇:GPIO
  • HTTPS 发送请求出现TLS握手失败
  • 数字化精益生产系统--IFS财务管理系统
  • 基于SpringBoot的校园台球厅人员与设备管理系统
  • 免杀笔记 ---> Session0--DLL注入
  • 如何做好IT类的技术面试?
  • A7 配置方式Master SPI如何更改位宽
  • linux kthread任务管理
  • 第一节 网络安全概述
  • 星光云VR全景系统源码
  • spdlog一个非常好用的C++日志库(七): 源码分析之异常类spdlog_ex
  • 从一次 SQL 查询的全过程了解 DolphinDB 线程模型
  • Vue3.js“非原始值”响应式实现基本原理笔记(二)
  • 论文 | PRCA: 通过可插拔奖励驱动的上下文适配器拟合用于检索问答的黑盒大语言模型
  • 网络状态的智能感知:WebKit 支持 Network Information API 深度解析
  • Vue3基础知识:组合式API中的provide和inject,他们作用是什么?如何使用?以及案例演示
  • Transformer自注意力机制(Self-Attention)模型
  • 【计算机体系结构】缓存的false sharing
  • Ubuntu24.04 Isaacgym的安装
  • docker 设置代理,通过代理服务器拉取镜像
  • OpenCV教程02:图像处理系统1.0(翻转+形态学+滤波+缩放+旋转)
  • 人工智能在招投标领域的运用---监控视频连续性检测
  • 加装德国进口高精度主轴 智能手机壳「高质量高效率」钻孔铣槽