2026/4/16 22:09:12
网站建设
项目流程
广东专业移动网站服务商,sem营销是什么意思,如何设计培训课程网页,wordpress的简单应用Typelists是一个用来操作一大群型别的C工具。就像lists对数值提供各种基本操作一样#xff0c;typelists对型别也提供相同的操作。 比如有时候必须对某些型别重复撰写相同的代码#xff0c;但是template又帮不上忙。假设需要实作一个Abstract Factory#xff0c;像如下这样工具。就像lists对数值提供各种基本操作一样typelists对型别也提供相同的操作。比如有时候必须对某些型别重复撰写相同的代码但是template又帮不上忙。假设需要实作一个Abstract Factory像如下这样classAbstractFactory{public:virtualWindow*createWindow()0;virtualButton*createButton()0;virtualScrollBar*createScrollBar()0;// ......};如果想将以上AbstractFactory的概念特化并纳入程序库中你必须让使用者得以产生针对任意性别的工厂但是template无法支持这一特性。此时Typelists可以帮助AbstractFactory泛化成功。Typelists的定义Typelists是一个编译期的类型链表该功能在c11/17中已经有std::tuple支持std::tuple的底层实现就是TypeList。定义如下templatetypenameT,typenameUstructTypeList{typedefT Head;typedefU Tail;}说明T当前节点存储的类型U当前节点的后继节点。该节点有两种情况一种情况是TypeList…类型链表的下一个节点另一个情况是标记一种类型即代表链表的尾部。typedef T Head; 代表当前节点存储大的类型typedef U Tail; 代表下一节点即列表的剩余部分。比如定义一个嵌套实例化的链表typedef TypeListint, TypeListdouble, TypeListstd::string, void MyTyppes;中Head代表intTail代表TypeListdouble, TypeListstd::string, void按索引访问按索引访问定义如下templatetypenameTList,unsignedintindexstructTypeAt;templateclassHead,classTailstructTypeAtTypeListHead,Tail,0{typedefHead Result;};templateclassHead,classTail,unsignedintindexstructTypeAtTypeListHead,Tail,index{typedeftypenameTypeAtTail,index-1::Result Result;}说明首先声明主模板再通过模板的特化实现具体逻辑。实现模版的全特化作为递归的终止条件即当index0时获得的类型为Head存储的对应类型实现模板的偏特化作为递归的递归逻辑进行模板的逻辑推倒即跳过列表的头部元素去剩余的类型中找第index-1个类型依次类推直到index变成0.typename是一种语法要求声明访问的是类型。访问嵌套模板时必须用typename声明是类型举个例子比如需要访问上面定义的MyTypes中下表为2的类型推倒过程如下TypeAtMyTypes, 2::Result TypeAtTypeListint, TypeListdouble, TypeListstd::string, void, 2::Result TypeAtTypeListdouble, TypeListstd::string, void, 1::Result TypeAtTypeListstd::string, void, 0::Result; std::string