c++泛型编程之Typelists

Typelists是一个用来操作一大群型别的C++工具。就像lists对数值提供各种基本操作一样,typelists对型别也提供相同的操作。
比如有时候必须对某些型别重复撰写相同的代码,但是template又帮不上忙。假设需要实作一个Abstract Factory,像如下这样:

classAbstractFactory{public:virtualWindow*createWindow()=0;virtualButton*createButton()=0;virtualScrollBar*createScrollBar()=0;// ......};

如果想将以上AbstractFactory的概念特化,并纳入程序库中,你必须让使用者得以产生针对任意性别的工厂,但是template无法支持这一特性。此时Typelists可以帮助AbstractFactory泛化成功。

Typelists的定义

Typelists是一个编译期的类型链表,该功能在c++11/17中已经有std::tuple支持,std::tuple的底层实现就是TypeList。定义如下:

template<typenameT,typenameU>structTypeList{typedefT Head;typedefU Tail;}

说明:
T:当前节点存储的类型
U:当前节点的后继节点。该节点有两种情况,一种情况是TypeList<…>类型(链表的下一个节点),另一个情况是标记一种类型,即代表链表的尾部。
typedef T Head; 代表当前节点存储大的类型;
typedef U Tail; 代表下一节点,即列表的剩余部分。
比如定义一个嵌套实例化的链表:typedef TypeList<int, TypeList<double, TypeList<std::string, void>>> MyTyppes;中,Head代表int,Tail代表TypeList<double, TypeList<std::string, void>>

按索引访问

按索引访问定义如下:

template<typenameTList,unsignedintindex>structTypeAt;template<classHead,classTail>structTypeAt<TypeList<Head,Tail>,0>{typedefHead Result;};template<classHead,classTail,unsignedintindex>structTypeAt<TypeList<Head,Tail>,index>{typedeftypenameTypeAt<Tail,index-1>::Result Result;}

说明:
首先声明主模板,再通过模板的特化实现具体逻辑。
实现模版的全特化作为递归的终止条件,即当index=0时,获得的类型为Head存储的对应类型;
实现模板的偏特化作为递归的递归逻辑,进行模板的逻辑推倒,即跳过列表的头部元素,去剩余的类型中找第index-1个类型,依次类推,直到index变成0.
typename是一种语法要求,声明访问的是类型。访问嵌套模板时,必须用typename声明是类型
举个例子:比如需要访问上面定义的MyTypes中下表为2的类型,推倒过程如下:

  1. TypeAt<MyTypes, 2>::Result
  2. => TypeAt<TypeList<int, TypeList<double, TypeList<std::string, void>>>, 2>::Result
  3. => TypeAt<TypeList<double, TypeList<std::string, void>>, 1>::Result
  4. => TypeAt<TypeList<std::string, void>, 0>::Result;
  5. => std::string

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

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

相关文章

深圳金鑫磁材|深圳纳米晶磁芯:氢能退火、再生金属,碳中和实践

在新能源汽车、5G通信、光伏逆变器等新兴产业高速发展的浪潮中&#xff0c;电磁元件的效率、体积与可靠性成为制约技术突破的关键瓶颈。作为全球纳米晶磁芯研发与制造的核心区域&#xff0c;深圳凭借其技术积累与产业集群优势&#xff0c;正推动这一“软磁全能选手”从实验室走…

飞书多维表格工作流指南(AI日报小助手)

之前发过几篇能写入飞书的扣子Coze工作流&#xff0c;有不少同学会卡在输出到飞书这一步&#xff0c;出现问题时不知道该如何解决。今天我们直接跳过扣子&#xff0c;用飞书多维表格搭建一个工作流——AI日报小助手&#xff0c;非常简单的入门案例。用飞书搭建工作流&#xff0…

吴忠羽球新势力!金牌教练韩宁波:用专业点燃你的赛场梦想

我的“冠军引路人”——韩宁波教练&#xff1a;以专业之名&#xff0c;点燃羽球梦想在吴忠的羽毛球场上&#xff0c;有这样一位传奇人物——韩宁波教练&#xff0c;他虽非赛场上的超级巨星&#xff0c;却是无数羽毛球少年心中“满级玩家”般的存在。韩教练手中的球拍&#xff0…

2026大模型智能体(Agent)面试全攻略

目录 一、核心概念与架构篇 Q1&#xff1a;请简述Agent的基本架构组成&#xff0c;并解释其与传统LLM Chain的区别。Q2&#xff1a;解释ReAct模式的工作原理。Q3&#xff1a;如何实现Agent的长期记忆&#xff08;Long-term Memory&#xff09;&#xff1f; 二、多智能体协同&am…

强烈安利自考必用TOP9一键生成论文工具测评

强烈安利自考必用TOP9一键生成论文工具测评 2026年自考论文写作工具测评&#xff1a;为何值得一看&#xff1f; 随着自考人数逐年攀升&#xff0c;论文写作成为众多考生必须跨越的难关。在这一过程中&#xff0c;如何高效完成选题、查资料、撰写与格式调整&#xff0c;成为影响…

强烈安利10个AI论文工具,助你轻松搞定本科生论文!

强烈安利10个AI论文工具&#xff0c;助你轻松搞定本科生论文&#xff01; AI 工具让论文写作不再难 对于大多数本科生来说&#xff0c;撰写论文是一项既紧张又充满挑战的任务。从选题到资料收集&#xff0c;再到撰写和修改&#xff0c;每一个环节都可能让人感到压力山大。而随着…

MBA必备10个降AIGC工具,高效避坑指南!

MBA必备10个降AIGC工具&#xff0c;高效避坑指南&#xff01; 1.「千笔」—— 一站式学术支持“专家”&#xff0c;从初稿到降重一步到位&#xff08;推荐指数&#xff1a;★★★★★&#xff09; 在MBA论文写作过程中&#xff0c;如何高效应对AI痕迹和查重率问题&#xff0c;成…

信创云文档如何解决Word公式粘贴的兼容性问题?

企业网站后台管理系统富文本编辑器功能扩展开发记录 一、需求分析与技术选型 作为新疆某软件公司的前端工程师&#xff0c;最近接到客户需求&#xff1a;在企业网站后台管理系统的文章发布模块中增加Word粘贴、Word文档导入和微信公众号内容粘贴功能。经过详细分析&#xff0…

Spring Boot Maven插件核心配置详解:从打包到部署全流程

在Spring Boot项目开发中&#xff0c;spring-boot-maven-plugin 是当之无愧的核心插件——它解决了传统Java Web项目打包复杂、部署繁琐的痛点&#xff0c;让项目实现“一键打包、独立运行”成为可能。本文将从插件核心配置解析、完整pom.xml示例、核心功能使用&#xff0c;到常…

.NET Core中如何实现航空航天领域的大文件分段上传与续传?

2023年XX月XX日 &#x1f31f; | 一个菜鸟程序员的“秃头”日记 &#x1f4bb; 今日份的崩溃与突破 早上8点&#xff1a;对着镜子默念三遍——“我能搞定10G文件上传&#xff01;”&#xff08;然后发现IE8连console.log都报错…&#xff09; 上午10点&#xff1a;试图用WebU…

解决 ROS 主从机通信问题:从机读取主机 Livox+Fast-LIO 建图数据并 RVIZ 可视化

解决 ROS 主从机通信问题&#xff1a;从机读取主机 LivoxFast-LIO 建图数据并 RVIZ 可视化 问题背景 在基于香橙派&#xff08;主机&#xff0c;IP&#xff1a;10.164.150.221&#xff09;和华硕 ROG 笔记本&#xff08;从机&#xff0c;IP&#xff1a;10.164.150.69&#xff0…

git拉取提示本地分支和远程分支存在差异快速解决

git警告如下图这种情况通常发生在&#xff1a; 你本地有未推送的提交 同时远程也有你本地没有的新提交 两个分支的历史产生了分歧 解决&#xff1a; 方案一&#xff1a;使用合并&#xff08;merge&#xff09;- 最安全 bash 1. 设置为默认使用合并策略 git config pull.rebase …

汽车MES系统如何处理工艺卡片公式导入导出?

新疆Java程序员のCMS文档神器&#xff08;680元搞定版&#xff09; 作为刚接完国企CMS项目的Java老炮儿&#xff0c;我太懂你们要的"开箱即用甲方爸爸满意"的解决方案了&#xff01;今天就把压箱底的Word/PPT/Excel/PDF全能导入插件掏出来&#xff0c;预算680元&…

C#.NET前端组件如何支持芯片制造行业的大文件断点续传?

【一个即将毕业的武汉码农自救指南&#xff1a;从"大文件上传&#xff1f;那是什么&#xff1f;"到"哥的进度条会跳舞&#xff01;"的逆袭之路】 "同学&#xff0c;你的简历上写’熟悉前端开发’&#xff0c;那能说说怎么实现2G文件分片上传吗&#x…

关于阶层跃迁

记得当年的社会达尔文吗&#xff1f;达尔文从来没说过他的理论适用于社会科学。现在是阶层跃迁。物理学家也从来没有说过光电效应能导出阶层跃迁。你得明白&#xff0c;要阶层跃迁&#xff0c;首先得有阶层。用这个词的时候就把阶层的合理性给隐含了。而今天的阶层就是过去的阶…

网页上C#如何实现医疗行业的大文件分块上传与加密?

大文件上传系统开发全攻略&#xff08;兼容IE8的Vue3WebForm实现&#xff09; 项目背景 兄弟们&#xff0c;这次接了个硬骨头活儿&#xff01;客户要我们实现一个支持20G文件上传的系统&#xff0c;还要兼容IE8这种古董浏览器&#xff0c;预算只有100块&#xff01;不过别慌&…

智能座舱革新将至?广州2026这场展会解码AI与场景融合新赛道

智能座舱革新将至&#xff1f;广州2026这场展会解码AI与场景融合新赛道当汽车从出行工具向“移动智慧空间”转型&#xff0c;智能座舱正成为产业革新的核心战场。2026年11月27日至30日&#xff0c;AUTO TECH China 2026 广州国际汽车智能座舱及车载显示技术展览会将在广州中国进…

互联网医疗怎样实现电子处方公式跨平台转存?

富文本编辑器集成文档导入与图片自动上传功能开发记录 作为一名技术开发人员&#xff0c;我独立搭建了一个网站&#xff0c;目前正着手解决富文本编辑器中粘贴 Word 图片以及支持多种文档导入且图片自动上传至服务器的问题。以下是我详细的查找过程与开发记录。 一、需求明确…

国产化数据库如何存储网页编辑器中的动态公式?

针对在 Vue2 UEditor .NET Core 环境中实现 Word/Excel/PPT/PDF 粘贴导入且图片自动上传 的需求&#xff0c;结合你的技术栈和云服务&#xff08;华为云 OBS&#xff09;&#xff0c;以下是可直接落地的开源解决方案&#xff1a; 一、核心方案&#xff1a;UEditor WordPast…

.NET MVC中如何支持教育行业的大文件夹上传解决方案?

【一个.NET程序员的悲喜交加&#xff1a;前端搞定了&#xff0c;后端求包养&#xff01;】 各位道友好&#xff01;俺是山西某个人.NET程序员&#xff0c;刚啃完《C#从入门到住院》&#xff0c;就被客户按头要求搞个20G大文件上传下载系统。现在前端用Vue3原生JS硬怼出了半成品…