C++:一个以继承方式展开模板参数包的步步解析

ops/2024/12/17 7:22:41/

我们来分析一下主函数中T的最终类型是什么。

// T1
template<int...>
struct IndexSeq {};// T2
template<int N, int... Indices>
struct MakeIndices : MakeIndices<N - 1, N - 1, Indices...> {};// T3
template<int... Indices>
struct MakeIndices<0, Indices...>
{typedef IndexSeq<Indices...> type;
};int main()
{using T = MakeIndices<3>::type;
}

MakeIndices<3>

非类型参数构成类型的一部分,因此 MakeIndices<3> 也是一个独一无二的类型。

类型 MakeIndices<3> 匹配模板T2,不过参数包里没有模板参数,由此展开生成如下代码:

struct MakeIndices<3> : public MakeIndices<2, 2> // 参数包参数个数为0,展开后就是没有
{
};

MakeIndices<2, 2>

类型 MakeIndices<2, 2> 匹配模板T2,参数包有1个参数,值为2,由此展开生成如下代码:

struct MakeIndices<2, 2> : public MakeIndices<1, 1, 2> // 参数包有1个值为2(后面的那个2)的参数
{
};

MakeIndices<1, 1, 2>

类型 MakeIndices<1, 1, 2> 匹配模板T2,参数包有2个参数,值为1,2,由此展开生成如下代码:

struct MakeIndices<1, 1, 2> : public MakeIndices<0, 0, 1, 2>
{
};

MakeIndices<0, 0, 1, 2>

类型 MakeIndices<0, 0, 1, 2> 匹配特化模板T3,参数包有3个参数,值为0,1,2,由此展开生成如下代码:

struct MakeIndices<0, 0, 1, 2>
{typedef IndexSeq<0, 1, 2> type;
};

MakeIndices<3>::type

由此 MakeIndices<3>::type 的类型为:struct IndexSeq<0, 1, 2>


http://www.ppmy.cn/ops/142585.html

相关文章

Ubuntu安装Gitlab详细图文教程

1、环境准备 1.1、Ubuntu环境 Ubuntu24.04Sever版安装教程 1.2、更新系统 sudo apt update -y sudo apt-get update sudo apt-get upgrade 2、安装Nginx 2.1 安装nginx # 安装 apt install nginx -y 2.2 修改nginx配置⽂件 # 修改nginx配置 vim /etc/nginx/si…

阿里云服务器手动部署LNMP环境【官方文档注意事项】

这是官方文档 注意&#xff1a; 要添加安全组&#xff0c;端口为80。否则最后用浏览器访问公网IP没有结果。 Mysql密码策略要求密码至少包含一个大写字母、一个小写字母、一个数字和一个特殊字符&#xff0c;并且密码总长度至少为 8 个字符。sudo mysqladmin -uroot -p<ol…

【多模态实战】在本地计算机上使用小型视觉语言模型【VLM】进行目标计数【附源码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

GB28181系列四:GB28181实战

我的音视频/流媒体开源项目(github) GB28181系列目录 目录 一、GB28181平台 二、IPC向BXC_SipServer注册 三、GB28181播放器 GB28181的基础理论已经介绍完毕&#xff0c;上篇文章也介绍了GB28181流媒体服务器ZLMediaKit&#xff0c;本篇文章将搭建一整套的GB28181框架&…

5G学习笔记之SNPN系列之ID和广播消息

目录 1. 概述 2. SNPN ID 3. SNPN广播消息 1. 概述 SNPN&#xff1a;Stand-alone Non-Public Network&#xff0c;独立的非公共网络&#xff0c;由NPN独立运营&#xff0c;不依赖与PLMN网络。 SNPN不支持的5GS特性&#xff1a; 与EPS交互 emergency services when the UE acce…

【C++】易混淆——多继承和多态,虚继承和虚函数用法示例

多继承不是多态 二者的区别如下&#xff1a; ①多继承 概念&#xff1a;指一个派生类可以同时继承多个基类的属性和方法。例如&#xff1a; class Base1 { public:void function1() {} };class Base2 { public:void function2() {} };class Derived : public Base1, public…

平衡二叉树

本节来学习判断一棵二叉树是否为平衡二叉树,并使用两种解决问题方法.第一种采用自顶向下的方式,效率不理想,第二种采用自下而上的方式,当发现不满足条件时终止.通过实例感受到程序设计思想对执行效率的重要影响. 问题描述: 给定一棵二叉树,判断该二叉树是否为平衡二叉树. 自顶…

VR虚拟展厅的实时互动是如何实现的?

VR虚拟展厅的实时互动是通过一系列技术和流程实现的&#xff0c;这些技术和流程共同确保了用户在虚拟环境中的互动体验能够及时响应和更新。 接下来&#xff0c;由专业从事VR虚拟展厅制作的圆桌3D云展厅平台为大家介绍一下实现VR虚拟展厅实时互动的几个关键要素&#xff1a; 高…