C++11中可变参数模板使用

news2024/9/21 14:33:17

在看同事编写的代码,发现有如下的代码,因为没用过,所以查了一下这是什么语法,通过查询资料知道了这是C++11中增加的可变参数模板。

 template<class T, class ...Args>
bool GetValue(T &value, Args &&...args) const;

template<class T, class ...Args>
static bool GetValue(T &value, const nlohmann::json &jsData, Args &&...args);

C++11以前,类模板和函数模板只能含有固定数量的模板参数,虽然类型灵活了但是个数不灵活,不够完美,可变参数模板允许模板定义中包含0到任意个模板参数,解决以前模板参数个数不灵活的的缺陷。

1.可变参数模板写法

情况一:完全泛化

template<typename... Types>

或者
template<class ...Args>

情况二:部分泛化

template<typename T, typename... Types>

或者
template<class T, class ...Args>

2.可变参数模板使用

2.1 函数模板的使用

举例一:

 #include <iostream>
 #include <string>

 using namespace std;

void MyPrint() {}

template<class T, class... Args>
void MyPrint(const T& firstArg, const Args&... args) {
	std::cout << firstArg << " " << sizeof...(args) << std::endl;
	MyPrint(args...);
}

int main()
{
    MyPrint(111, 222, 333, 444, 555, 666);
    return 0;
}

运行结果:

 

举例二:找出一堆数中最小的一个

#include <iostream>

template <typename T>
T MyMin(T value) {
  return value;
}

template <typename T, typename... Types>
T MyMin(T value, Types... args) {
  return std::min(value, MyMin(args...));
}

int main(int argc, char *argv[]) {
    std::cout << MyMin(56, 23, 5, 17, 678, 9) << std::endl;
    
    return 0;
}

运行结果如下:

 

2.2 类模板使用

举例:

#include <iostream>

template<typename... Values> class MyTuple;
template<> class MyTuple<> {};

template<typename Head, typename... Tail>
class MyTuple<Head, Tail...>
  : private MyTuple<Tail...>
{
  typedef MyTuple<Tail...> inherited;
  public:
    MyTuple() {}
    MyTuple(Head v, Tail... vtail) : m_head(v), inherited(vtail...) {}
    Head& head() {return m_head;}
    inherited& tail() {return *this;}
  protected:
    Head m_head;
};

int main(int argc, char *argv[]) {
	MyTuple<char, int, float, std::string> t('A', 888, 3.1415926, "hello world");
	std::cout << t.head() << " " << t.tail().head() << " " << t.tail().tail().head() << 
    " " << t.tail().tail().tail().head() << std::endl;

	return 0;
}

运行结果如下:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/61519.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

12.2-12.4总结

12.2 明明跟着Vue3的视频学的&#xff0c;结果今天发现我学的都是vue2的写法&#xff0c;导致网上查阅资料调用组件有很多东西看不懂。设置langts也用不了&#xff0c;所以去查文档&#xff0c;增加配置了。 -安装vue-cli手脚架 解决lang"ts"报错http://t.csdn.cn/…

【力扣周总结】

题目汇总 判断括号的合法 #20 有效的括号&#xff08;栈问题 stack &#xff09;#921. 使括号有效的最少添加&#xff08;纯逻辑题&#xff09;#1541. 平衡括号字符串的最少插入次数&#xff08;纯逻辑题&#xff09; 单调(递减)栈 - Next Greater Element 题型 496. 下一个…

计算机毕业设计源码——基于Android的真人社交游戏辅助应用开发

编号 本科生毕业设计&#xff08;论文&#xff09; 题目&#xff1a; 真人社交游戏辅助应用开发 专业 学 号 学生姓名 指导教师 摘 要 时至今日&#xff0c;社交已成为人们生活中必不可少的一部分&#xff0c;社交网络的盛行已经成为一种必然趋势&#xff0e;与此同时&a…

央企招聘:正式编制!八险三金!各项福利!中国邮政招人啦!

中国邮政薪酬待遇情况 &#xff08;仅供参考&#xff09; &#xff08;一&#xff09;薪酬水平 1.邮储总行&#xff1a;刚入职有六个月实习期&#xff0c;月薪6k左右&#xff0c;转正以后一年到手大概25w&#xff0c;在大行中处于中等偏上。利润中心等部门可能更高一些&#…

Java基于JSP的幼儿园管理系统

幼儿是祖国的花朵,是未来国家建设的接班人。如果能够让幼儿园更好的对院所内部进行更好的管理是很多家长和幼儿园的工作人员所关心的问题。为此我开发了幼儿园管理系统,让家长和院所的管理人员能够更好的进行沟通,从而到达更好的培养幼儿和让家长更好的了解自己孩子生活教育问题…

springboot自定义参数解析器

springboot自定义参数解析器1.前言2.springMVC参数解析器3.如何自定义参数解析器4测试1.前言 1.springMVC是如何把参数解析完毕后注入到controller方法参数上的呢&#xff1f;在javaweb阶段&#xff0c;我们都学过使用HttpServletRequest这个对象获取参数&#xff0c;比如 req…

Dubbo-服务暴露

前言 Dubbo源码阅读分享系列文章&#xff0c;欢迎大家关注点赞 SPI实现部分 Dubbo-SPI机制 Dubbo-Adaptive实现原理 Dubbo-Activate实现原理 Dubbo SPI-Wrapper 注册中心 Dubbo-聊聊注册中心的设计 Dubbo-时间轮设计 通信 Dubbo-聊聊通信模块设计 RPC 聊聊Dubbo协议 …

【编程题】【Scratch四级】2022.09 绘制图形

绘制图形 1. 准备工作 &#xff08;1&#xff09;默认小猫角色&#xff0c;默认白色背景。 2. 功能实现 &#xff08;1&#xff09;绘制出如上图所示图案&#xff0c;图形的中心在舞台中心点&#xff1b; &#xff08;2&#xff09;图形由12条蓝红相间&#xff0c;长度为80…

[附源码]Python计算机毕业设计Django咖啡销售平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

最强大脑记忆曲线(13)--应用程序的加密及授权码的实现

加密和授权一、python程序加密与授权的思考二、python文件 加密三、注册机代码目前我的小项目“最强大脑记忆曲线”已经可以出1.0版了&#xff0c;发布之前的最后一个环节就是给应用程序加密&#xff0c;并增加授权码了。关于这些&#xff0c;我之前思考过很多&#xff0c;因为…

【数据结构】二叉树OJ练习

&#x1f451;作者主页&#xff1a;进击的安度因 &#x1f3e0;学习社区&#xff1a;进击的安度因&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 文章目录一、二叉树的最小深度二、单值二叉树三、相同的树四、另一棵树的子树五、翻转二叉树六、…

毫米波传感器原理介绍:测速_1相位

在前文中&#xff0c;我们分析了 IF信号的频率&#xff0c;并展示了该频率与物体到雷达的距离 成正比。在本文中&#xff0c;我们将探讨IF 信号的相位。如果我们希望了解 FMCW 雷达响应物体极小位移的能力&#xff0c;那么研究相位就非常重要。雷达正是凭此非常快速且准确地测量…

Java 基础之线程

线程是 cpu 可以调度的最小单元&#xff0c;多线程可以利用 cpu 轮询时间片的特点&#xff0c;在一个线程进入阻塞状态时&#xff0c;快速切换到其余线程执行其余操作&#xff0c;减少用户的等待响应时间。所以我们需要了解线程的基本概念&#xff0c;如何启动线程以及怎么去控…

最短路径(Dijkstra算法与Floyd算法)

一、Dijkstra算法 Dijkstra算法与之前学习过的Prim算法有些相似之处。我们直接通过一个例子来讲解 假设要求的是A->E之间的最短路径。首先我们来列出顶点A到其他各顶点的路径长度&#xff1a;A->D 2&#xff0c;A->B 6&#xff0c;A->C 1&#xff0c;A->E…

MySQL主从复制

MySQL主从复制 MySQL主从复制原理 主服务器在更新数据前&#xff0c;会写入硬盘&#xff0c;银盘在再将数据写入二进制日志 从服务器开启I/O线程&#xff0c;Master节点为每个I/O线程启动一个dump线程用于发送二进制事件到从服务器的中继日志中 从服务器的sql线程开启&…

springboot集成dubbo配置多注册中心

1 dubbo多注册中心 dubbo可以支持多注册中心&#xff0c;以及多协议, 本文示例dubbo同时注册到nacos和zookeeper注册中心&#xff1a; 在前文基础上&#xff0c;给provider consumer模块加上zookeeper依赖&#xff1a; <dependency><groupId>org.apache.dubbo<…

TypeScript26(TS进阶用法Record Readonly)

Readonly Readonly与我们上一章节学的Partial 很相似&#xff0c;只是把? 替换成了 Readonly // 源码 type Readonly<T> {readonly [P in keyof T]: T[P]; }; 疑问&#xff1a; keyof 是干什么的&#xff1f; in 是干什么的&#xff1f; Readonly 是将该属性变为…

【HBU】数据结构第一次月测题(线性结构)

数据结构第一次月测题 判断题&#xff1a; 1.在具有N个结点的单链表中&#xff0c;访问结点和增加结点的时间复杂度分别对应为O&#xff08;1&#xff09;和O&#xff08;N&#xff09; F 访问节点的时间复杂度为O(N) 2.对于顺序存储长度为N的线性表&#xff0c;…

DataBinding原理----双向绑定(4)

前面的几种文章分析了DataBinding单向数据绑定的原理&#xff0c;今天来看看双向数据绑定是怎么回事。 我们知道单向绑定是在数据发生变化的时候能够通知到UI&#xff0c;让数据的变化能够及时反应到UI上&#xff1b;而双向绑定则是不仅要让数据的变化能够反馈到UI上&#xff0…

web前端-javascript-立即执行函数(说明、例子)

立即执行函数 /* (function(){alert("我是一个匿名函数~~~"); })(); */(function (a, b) {console.log("a " a);console.log("b " b); })(123, 456);1. 说明 函数定义完&#xff0c;立即被调用&#xff0c;这种函数叫做立即执行函数立即执…