c++11 可变参数模板类

2023-10-26

可变参数模板类,如元组:

template<class... Args>

class tuple;

递归和特化的方式展开参数包

//可变参数模板类前向声明

template<typename... Args>
struct Sum;

//定义展开参数的可变参数模板类

template<typename First, typename... Rest>
struct Sum<First, Rest...>
{
    enum{ value = Sum<First>::value + Sum<Rest...>::value };
};

//可变参数模板类的特化,递归的终止类

template<typename Last>
struct Sum<Last>
{
    enum { value = sizeof(Last) };
};

cout << Sum<int, double, short>::value << endl;         //14

也可以省去前向声明:

template<typename First, typename... Rest>
struct Sum
{
    enum{ value = Sum<First>::value + Sum<Rest...>::value };
};

template<typename Last>
struct Sum<Last>
{
    enum { value = sizeof(Last) };
};

还可以使用std::integral_constant消除枚举中value的定义

//前向声明
template<typename... Args>
struct Sum;

//定义
template<typename First, typename... Rest>
struct Sum<First, Rest...>:std::integral_constant<int, Sum<First>::value +
    Sum<Rest...>::value>
{
};

//递归终止
template<typename Last>
struct Sum<Last> :std::integral_constant<int, sizeof(Last)>
{
};

也可以通过继承的方式展开参数包

//整形序列的定义
template<int...>
struct IndexSeq
{

};

//继承方式展开参数包
template<int N, int... indexes>
struct MakeIndexes : MakeIndexes<N - 1, N - 1, indexes...>
{

};

//模板特化,终止展开参数包
template<int... indexes>
struct MakeIndexes<0, indexes...>
{
    typedef IndexSeq<indexes...> type;
};

using T = MakeIndexes<3>::type;
cout << typeid(T).name() << endl;        //struct IndexSeq<0,1,2>

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++11 可变参数模板类 的相关文章

随机推荐

  • 前端面试题精心整理(一)-TypeScript

    文章目录 TypeScript相关问题及知识点 Q1 ts中type和interface的区别 A1 有相同点与不同点 具体内容如下 Q2 ts中interface和class的区别 分别什么时候使用 A2 interface和class都
  • 运放专题:电压电流转换

    电压电流转换 电压 电流转换即V I转换 是将输入的电压信号转换成满足一定关系的电流信号 转换后的电流相当一个输出可调的恒流源 其输出电流应能够保持稳定而不会随负载的变化而变化 一般来说 电压电流转换电路是通过负反馈的形式来实现的 可以是电
  • python程序设计基础实验题_Python程序设计实验报告:实验五 综合运用三种基本结构进行程序设计...

    实验五 综合运用三种基本结构进行程序设计 综合性实验 班级 物流191 姓名 韩晶晶 学号 3190505140 指导老师 修宇 成绩 日期 2020 4 25 实验目的 1 进一步掌握选择与循环结构程序设计的方法和技巧 2 综合运用三种基
  • Docker Search 异常:Error response from daemon: Get https://index.docker.io/v1/search?xxx

    docker search tomcat Error response from daemon Get https index docker io v1 search q tomcat n 25 dial tcp lookup index
  • KGDB调试内核

    1 环境 Ubuntu 20 04 VMware Worksation 16 Player Linux Kernel 5 4 0 2 设置虚拟机 2 1 准备两台虚拟机 准备一台虚拟机 然后克隆一台虚拟机 下面以左边为客户端和右边为目标机展
  • phpstorm 自动折叠注释

    用了swagger后 注释得写好大一堆 超过一百行的注释都很常见 看起来心好累 phpstorm 能不能自动折叠那些注释呢 网上搜索不到办法 自己尝试去设置了找了下 原来还真有这个功能 设置方法如下 在设置搜索 fold 勾上 Docume
  • Self-study Python Fish-C Note-4 P20-P26 (part1)

    python 中的列表 Part 1 本文主要讲解了python中列表的使用 本文为自学B站上鱼C的python课程随手做的笔记 如有问题 欢迎大家批评指正 原视频链接 https www bilibili com video BV1c44
  • 排序方法与初始排列次序的关系

    元素的移动次数与关键字的初始排列次序无关的是 基数排序 元素的比较次数与初始序列无关是 选择排序 折半插入排序 算法的时间复杂度与初始序列无关的是 选择排序 堆排序 归并排序 基数排序 算法的排序趟数与初始序列无关的是 插入排序 选择排序
  • TongWeb上应用部署方式

    TongWeb上可部署的web应用结构可分为两种 1 打成war包形式的文件 2 以文件夹目录方式的web应用 这两种方式必须要有WEB INF目录才是一个合法web应用结构 方可部署 特殊情况 某些应用是在apache nginx上跑的静
  • linux中管道的概念,浅谈Linux管道

    管道 pipe 是一个我们在学习Linux命令行的时候就会引入的一个很重要的概念 管道是UNIX环境中历史最悠久的进程间通信方式 从本质上说 管道也是一种文件 也是遵循UNIX的 一切皆文件 的原则设计的 虽然实现形态上是文件 但是管道本身
  • vue3的自定义指令API

    vue3中指令api和组件保持一致 具体表现在 bind beforeMount inserted mounted beforeUpdate new 元素自身更新前调用 和组件生命周期钩子很像 update removed 和updated
  • 【vue】vue-element-admin安装npm install报错

    1 从gitee上拉取vue element admin工程文件 2 删除 package json文件里面的tui editor依赖 强调是删除不是注释掉 3 管理员权限运行cmd 目录进入到 vue element admin目录 4
  • 网络基础——OSI模型

    目录 一 OSI七层模型的提出 二 OSI七层模型介绍 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 三 TCP IP协议 部分重要协议使用对应端口 四 数据封装过程 五 不同层级与设备的对应关系 一 OSI七层模型的提出 O
  • Labelme库的json2dataset函数改写

    可用于方便的将json格式的标注文件转换为png jpg等image文件 如果是conda环境的话 pip install labelme之后 文件位置是 envs ENV NAME lib python3 6 site packages
  • 史上最详细中文版Visual Studio2012安装步骤图解新手教程

    下面是IT认证考试资源网总结的Visual Studio 2012的安装方法 1 注意 只有Visual Studio 2012才能进行 Windows 8 应用商店 也就是Windows 8 风格应用程序 程序的开发 Visual Stu
  • 星星之火-57:前传接口 CPRI的速率、能力、小区带宽之间的映射关系

    CPRI的速率 能力 小区带宽之间的映射关系 Rate1 Rate2 Rate3 Rate4 Rate5 Rate6 Rate7 带宽数量 Rate8 Rate9 Rate10 说明 614 4 1228 8 2457 6 3072 491
  • 统一网关Gateway快速入门

    1 为什么需要网关 为了不让任何人都能访问我们的微服务 对用户的身份进行一个验证 如果是内部人员才允许访问 如果不是就拦截禁止访问 一切请求都得通过网关在进入到微服务中 2 搭建网关服务 2 1 创建新的module引入依赖
  • 2020年终总结,不容易的一年

    去年写年终总结的时候我写了一幅字 鼠年吉祥 但这一年并不安康 对整个人类社会来说是大灾大难的一年 过去的2020年太不容易了 每个人都不容易 公司不容易 中国不容易 整个世界不容易 因为整个人类经历了一场前所未有的浩劫 新冠病毒的侵袭 泡汤
  • 软工实习日记1

    今天是软工实习的第一天 主要的任务有进行JDBC的相关测试 并且开始学习Spring框架的相关内容 由于我有一段时间没有接触Java相关内容了 所以先大致过了一遍关键点 找了下感觉 然后将JDBC连接测试完成 下面会给出部分关键步骤 JDB
  • c++11 可变参数模板类

    可变参数模板类 如元组 template