news 2026/4/16 15:30:39

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/4/16 13:16:21

关于阶层跃迁

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

作者头像 李华
网站建设 2026/4/16 13:15:20

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

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

作者头像 李华
网站建设 2026/4/15 19:48:23

python实现dbc生成矩阵(csv格式)

直接上代码。必要依赖库自行安装&#xff1a; #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ dbc_to_matrix.py 解析 DBC 文件&#xff08;不依赖 cantools&#xff09;&#xff0c;导出 signals.csv, messages.csv, 并为每个消息生成 64-bit bitmap 文本…

作者头像 李华
网站建设 2026/4/15 20:33:18

Python | K折交叉验证的参数优化的RANSAC回归预测及可视化算法

立个flag&#xff0c;这是未来一段时间打算做的Python教程&#xff0c;敬请关注。1 数据及应用领域我的程序中给出数据data.xlsx&#xff08;代码及数据见文末&#xff09;&#xff0c;10 列特征值&#xff0c;1 个目标值&#xff0c;适用于各行各业回归预测算法的需求&#xf…

作者头像 李华
网站建设 2026/4/8 21:04:17

题目1103:开心的金明 /题目 1100: 采药

背包问题的模板题#include<iostream> #include<algorithm> using namespace std; int main(){int n,m;cin>>n>>m;int a[25],b[25];int dp[100000];for(int i1;i<m;i){cin>>a[i]>>b[i];}for(int i1;i<m;i){for(int jn;j>a[i];j--)…

作者头像 李华
网站建设 2026/4/11 14:02:58

怎样用AI技术更快找到合适的客户呢?

理解AI客户获取的基本概念什么是AI客户获取技术&#xff1f;AI客户获取技术&#xff0c;就是利用人工智能销售助手等工具&#xff0c;通过分析数据和算法&#xff0c;帮助我们快速找出合适的客户和管理他们。借助智能获客系统&#xff0c;我们能轻松捕捉到潜在客户的信息&#…

作者头像 李华