• 【C++】可变参数模板使用,在emplace中应用


    🌏博客主页: 主页
    🔖系列专栏: C++
    ❤️感谢大家点赞👍收藏⭐评论✍️
    😍期待与大家一起进步!



    一、可变参数模板

    可变参数模板的使用:

    template<class T>
    void ShowList(T value) {
    	cout << value<<" ";
    }
    
    template<class T,class ...Args>
    void ShowList(T value, Args...args) {
    	cout << value << " ";
    	ShowList(args...);
    }
    // Args是一个模板参数包,args是一个函数形参参数包
    // 声明一个参数包Args...args,这个参数包中可以包含0到任意个模板参数。
    int main()
    {
    	ShowList(1);
    	cout << endl;
    	ShowList(1, 'A');
    	cout << endl;
    	ShowList(1, 'A', std::string("sort"));
    	cout << endl;
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    上面的参数args前面有省略号,所以它就是一个可变模版参数,我们把带省略号的参数称为“参数包”,它里面包含了0到N(N>=0)个模版参数。我们无法直接获取参数包args中的每个参数的,只能通过展开参数包的方式来获取参数包中的每个参数,这是使用可变模版参数的一个主要特点,也是最大的难点,即如何展开可变模版参数。由于语法不支持使用args[i]这样方式获取可变参数

    1.参数包的展开方式

    1.递归方式展开

    在这里插入图片描述
    当递归到参数包里面只有一个参数的时候会去调用第一个ShowList(T value)函数

    2.逗号表达式展开参数包

    template <class T>
    void PrintArg(T t)
    {
    	//printarg不是一个递归终止函数,只是一个处理参数包中每一个参数的函数。
    	cout << t << " ";
    }
    //展开函数
    template <class ...Args>
    void ShowList(Args... args)
    {
    	int arr[] = { (PrintArg(args), 0)...  };
    	//先执行printarg(args),再得到逗号表达式的结果0
    	//最终会创建一个元素值都为0的数组
    	//由于是逗号表达式,在创建数组的过程中会先执行逗号表达式前面的部分printarg(args)
    	//打印出参数,也就是说在构造int数组的过程中就将参数包展开了,这个数组的目的纯粹是为了在
    	//数组构造的过程展开参数包
    	cout << endl;
    }
    int main()
    {
    	ShowList(1);
    	ShowList(1, 'A');
    	ShowList(1, 'A', std::string("sort"));
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    二、emplace

    我们看到的emplace系列的接口,支持模板的可变参数,并且万能引用
    这是因为使用这种方式某种程度上可以提高效率 在这里插入图片描述
    在这里插入图片描述
    emplace直接自己去构建pair中的类型,省去了string中还要进行交换的过程。
    在这里插入图片描述

  • 相关阅读:
    【AutoSAR CAN】02 - 硬件过滤器配置
    LeetCode刷题日志-17.电话号码的字母组合
    AI助手引领游戏创作革命
    java计算机毕业设计在线学习跟踪系统前台源程序+mysql+系统+lw文档+远程调试
    【Unity】【VR】如何用键鼠模拟VR输入
    猿创征文 | 万字总结C文件
    Fedora安装腾讯会议
    图的数据结构
    egg.js框架的基本设置 及 使用
    nginx 配置|禁止访问规则
  • 原文地址:https://blog.csdn.net/m0_74774759/article/details/133521784