码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C++11 - 6 - 可变参数模板


    c++

    C++11 - 可变参数模板

    • 前言:
    • 可变参数模板:
      • 以往的可变参数:
        • printf():
        • main():
      • 如今的定义:
      • 使用方式:
        • 数组+推导:
        • 重载+递归:

    前言:

    Vue框架:从项目学Vue
    OJ算法系列:神机百炼 - 算法详解
    Linux操作系统:风后奇门 - linux

    可变参数模板:

    以往的可变参数:

    printf():

    • printf()可以按照指定格式打印,参数数目不定
    printf("%d %s %c %u", 1, "aaa", 'a', -1);
    
    • 1

    main():

    • main()函数的调用机制:
    1. OS调用加载器,
    2. 加载器调用mainCRCStartup()函数,
    3. mainCRCStartup()函数调用main()函数
    4. 如果任务代码没有出问题,那么虽然main进程结束,但是return 的 0就会被mainCRCStartup()接收
    • main()函数命令行参数:
    int main(int argc, char* argv[], char* envp[]){
    	/*
    		argc统计命令行参数个数
    		argv存储命令行参数,以nullptr结尾
    		envp存储环境变量,以nullptr结尾
    	*/
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    如今的定义:

    • 定义方式:
    template <class ... Args>	//定义可变参数模板
    void ShowList(Args ... args){	//使用可变参数模板
    	//函数体
    };
    
    • 1
    • 2
    • 3
    • 4
    • 参数包内参数个数:

      可以使用sizeof()获取参数包内参数个数

    void ShowList(Args ... args){
    	for(size_t i=0; i<size_of...(Args); i++){
    		cout<<args[i]<<"   ";
    		//报错:必须在上下文中扩展参数包
    		//主要原因是参数包内参数类太复杂
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    使用方式:

    数组+推导:

    • 数组展开:
    #include 
    #include 
    using namespace std;
    template<class T>
    void PrintArg(T t){
    	cout<<typeid(T).name()<<":"<<t<<endl;
    }
    
    template <class ...Args>
    void ShowList(Args... args){
    	int arr[] = {(PrintArg(args), 0)...};
    	cout<<endl;
    }
    int main(){
    	cout<<"循环打印"<<endl;
    	ShowList(1, 'A', string("sort"));
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 数组说明:
      1. 每个括号都是一个逗号表达式,返回最右侧int
      2. 参数包展开成为多个逗号表达式,需要用数组接收返回值
    • …说明:
      1. 依次递增
      2. (PrintArg(args), 0)
      3. (PrintArg(args), 1)
      4. (PrintArg(args), 2)
      5. (PrintArg(args), 3)

    重载+递归:

    • 逐个展开参数包,最终只剩一个参数时换其他调用函数:
    #include 
    #include 
    using namespace std;
    template <class T>
    void Show(T t){
    	cout<<typeid(T).name() <<":"<<t<<endl;
    } 
    template <class T, class ... Args>
    void Show(T t, Args ... args){
    	cout<<typeid(T).name() <<":" <<t<<endl;
    	Show(args...);
    }
    int main(){
    	cout<<"递归打印"<<endl;
    	Show(1);
    	Show(1, 'A');
    	Show(1, 'A', string("sort"));
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 以{1, ‘A’, string(“sort”)}分析递归过程:
    1. 参数大于一个时:调用Show(T t, Args … args);
      1. 1作为变量t被打印出来, ‘A’,string(“sort”)被包装为新的args
      2. 'A’作为变量t被打印出来,string(“sort”)被包装为新的args
    2. 参数等于一个时:调用Show(T t)
      1. string(“sort”)作为变量t被打印出来
  • 相关阅读:
    软件测试行业到底有没有前景和出路?2022辞职后涨薪5K+,凭什么?
    [从零开始学习FPGA编程-57]:视野篇-异构系统、异构芯片、大小核、芯片互联网、UCIe标准
    【期权系列】常见期权定价模型与策略概览
    GitHub 官宣:弃用 trending 热榜,开发者炸锅了
    【javaWeb学习笔记】HTML,CSS,JS
    vite搭建vue3项目
    Windows 编写自动复制备份、删除文件定时任务脚本
    机器人导航+OPENCV透视变换示例代码
    CAD图形导出为XAML实践
    服务器中间件的种类和日常使用
  • 原文地址:https://blog.csdn.net/buptsd/article/details/126895841
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号