news 2026/6/15 20:57:30

c++泛型编程之Typelists

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 14:43:40

Springboot应急物资采购系统2548l(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表项目功能&#xff1a;学生,物资分类,物资商品,普通管理员开题报告内容一、研究背景与意义&#xff08;一&#xff09;现实背景近年来全球自然灾害与公共卫生事件频发&#xff0c;如2020年新冠疫情导致全球医疗物资缺口超20亿件&#xff0c;2021年河南暴雨造成应…

作者头像 李华
网站建设 2026/6/15 16:39:38

学霸同款10个AI论文工具,研究生轻松搞定毕业论文!

学霸同款10个AI论文工具&#xff0c;研究生轻松搞定毕业论文&#xff01; AI 工具如何成为论文写作的得力助手 在当前学术研究日益数字化的趋势下&#xff0c;AI 工具正逐步成为研究生们不可或缺的写作助手。无论是降低 AIGC 率、优化语言表达&#xff0c;还是提升论文逻辑性与…

作者头像 李华
网站建设 2026/6/15 13:22:57

靠谱的厌氧池清淤哪个酷

《厌氧池清淤哪家好&#xff1a;专业深度测评》开篇&#xff1a;定下基调厌氧池清淤是一项复杂且重要的工作&#xff0c;选择合适的清淤设备至关重要。为了帮助大家更好地了解市场上的厌氧池清淤产品&#xff0c;我们进行了这次专业深度测评。本次测评将基于真实数据与体验&…

作者头像 李华