news 2026/1/30 5:24:05

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/1/28 1:53:10

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

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

作者头像 李华
网站建设 2026/1/28 23:10:52

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

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

作者头像 李华
网站建设 2026/1/28 18:59:29

腾讯开源WeKnora_IMA框架深度解析

【重磅】腾讯开源 WeKnora&#xff08;IMA&#xff09;&#xff1a;重新定义企业级智能文档检索在信息爆炸的数字化时代&#xff0c;腾讯正式开源了基于大语言模型的文档理解与语义检索框架——WeKnora&#xff08;维娜拉&#xff09;。这款工具将文档解析、智能检索与大模型推…

作者头像 李华
网站建设 2026/1/28 23:57:35

如何查阅最新的研究论文

刚开始做科研的时候&#xff0c;我一直以为&#xff1a; 文献检索就是在知网、Google Scholar 里反复换关键词。 直到后来才意识到&#xff0c;真正消耗精力的不是“搜不到”&#xff0c;而是—— 你根本不知道最近这个领域发生了什么。 生成式 AI 出现之后&#xff0c;学术检…

作者头像 李华