当前位置: 首页 > news >正文

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.jsqmd.com/news/243855/

相关文章:

  • 深圳金鑫磁材|深圳纳米晶磁芯:氢能退火、再生金属,碳中和实践
  • 飞书多维表格工作流指南(AI日报小助手)
  • MBA必备10个降AIGC工具,高效避坑指南!
  • 吴忠羽球新势力!金牌教练韩宁波:用专业点燃你的赛场梦想
  • .NET Core中如何实现航空航天领域的大文件分段上传与续传?
  • 2026大模型智能体(Agent)面试全攻略
  • 强烈安利自考必用TOP9一键生成论文工具测评
  • 强烈安利10个AI论文工具,助你轻松搞定本科生论文!
  • 信创云文档如何解决Word公式粘贴的兼容性问题?
  • Spring Boot Maven插件核心配置详解:从打包到部署全流程
  • 解决 ROS 主从机通信问题:从机读取主机 Livox+Fast-LIO 建图数据并 RVIZ 可视化
  • 汽车MES系统如何处理工艺卡片公式导入导出?
  • git拉取提示本地分支和远程分支存在差异快速解决
  • 关于阶层跃迁
  • C#.NET前端组件如何支持芯片制造行业的大文件断点续传?
  • 网页上C#如何实现医疗行业的大文件分块上传与加密?
  • 智能座舱革新将至?广州2026这场展会解码AI与场景融合新赛道
  • 互联网医疗怎样实现电子处方公式跨平台转存?
  • 国产化数据库如何存储网页编辑器中的动态公式?
  • .NET MVC中如何支持教育行业的大文件夹上传解决方案?
  • 如何搜索学术论文:实用方法与高效技巧指南
  • 怎么找出一篇论文的研究问题——实用技巧与方法解析
  • 机械CAD如何与网页编辑器实现公式参数同步?
  • Springboot音乐网站890a8(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • Springboot应急物资采购系统2548l(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 革了程序员再革打工人:Anthropic发布Cowork,Claude Code走进数字办公自动化
  • 导师严选2026最新!9款AI论文网站测评:本科生毕业论文必备
  • 搜索研究文献的渠道有哪些
  • 告别昂贵人工标注,英伟达全自动视频理解助力小模型逆袭顶级大模型
  • 十二大顶尖大模型决战华尔街与量化投资