码农知识堂 - 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被打印出来
  • 相关阅读:
    pip 指定源(换源)
    云原生下的CI/CD:安装Argo CD
    【Android -- 数据存储】使用文件存储数据
    【scikit-learn基础】--『监督学习』之 支持向量机回归
    SQLSyntaxEProrException异常产生原因及解决方案
    Spring Security认证绕过漏洞(CVE-2022-22978)研究与防护手段
    Springboot福佳生活超市进销存管理系统 毕业设计-附源码261620
    使用 Jenkins + Github + dokcer-compose 部署项目-实战篇
    《程序员职场工具库》如何优化你的工作 —— PDCA 循环
    一名双非程序媛面试蚂蚁、美团、携程等大厂拿offer分享面试过程
  • 原文地址:https://blog.csdn.net/buptsd/article/details/126895841
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号