c++模版学习(typelist)2021-03-05

C++11 TypeList 妙用 源码展示: #include <iostream> using namespace std; template <typename> struct typelist; typedef typelist <int> defaultPolicys; template <typename> struct concat; template <typename> struct concat<typelist>, typelist<B> > { typ 立即下载

 

namespace tplt
{
    //基本的操作接口
    template <typename ... T>
    class typelist
    {

    };

    template <typename TPLT>
    class front;

    template <typename fisrt, typename ...other>
    class front<typelist<fisrt, other...>>
    {
    public:
        using type = fisrt;


    };

    template <typename TPLT>
    class size;

    template <typename ...args>
    class size<typelist<args...>>
    {
    public:
        static inline size_t value = sizeof...(args);
    };

    template <typename TPLT>
    class pop_front;

    template <typename fisrt, typename ...other>
    class pop_front<typelist<fisrt, other...>>
    {
    public:
        using type = typelist<other...>;


    };

    template <typename TPLT, typename NewElem>
    class push_front;



    template <typename ...Elem, typename NewElem>
    class push_front<typelist<Elem...>, NewElem>
    {
    public:
        using type = typelist<NewElem, Elem...>;
    };


    template <typename TPLT, typename NewElem>
    class push_back;

    template <typename ...Elem, typename NewElem>
    class push_back<typelist<Elem...>, NewElem>
    {
    public:
        using type = typelist<Elem..., NewElem>;
    };


    template <typename TPLT, typename NewElem>
    class replace_front;


    template <typename fisrt, typename ...other, typename NewElem>
    class replace_front<typelist<fisrt, other...>, NewElem>
    {
    public:
        using type = typelist<NewElem, other...>;
    };


    template <typename TPLT>
    class is_empty
    {
    public:
        static inline const bool value = false;
    };


    template <>
    class is_empty<typelist<>>
    {
    public:
        static inline const bool value = true;
    };
    //扩展
    //找index的类型
    template <typename TPLT, unsigned int index>
    class find :public find<typename pop_front<TPLT>::type, index -1>
    {

    };
    template <typename TPLT>
    class find<TPLT, 0> :public front<TPLT> 
    {

    };
    //找到最大的元素
    template <typename TPLT>
    class get_maxsize_type
    {
    private:
        //TPLT中的第一个元素
        using tl_first_elem = typename front<TPLT>::type;
        //TPLT中去掉第一个元素
        using tl_remain = typename pop_front<TPLT>::type;
        //递 归下去的get_maxsize_type中的typelist(模版参数)的第一个元素
        using t1_first_elem_rec = typename get_maxsize_type<tl_remain>::type;
    public:
        using type = typename std::conditional<
            sizeof(tl_first_elem) >= sizeof(t1_first_elem_rec),
            tl_first_elem,
            t1_first_elem_rec>::type;
    };

    template<>
    class get_maxsize_type<typelist<>>
    {
    public:
        using type = char;
    };


    //反转(reverse)
    template <typename TPLT, bool = is_empty<TPLT>::value>
    class reverse;

    //有元素
    template <typename TPLT>
    class reverse<TPLT, false>
    {
        //TPLT中的第一个元素
        using tl_first_elem = typename front<TPLT>::type;

        using tl_result_rec = typename reverse<
                                    typename pop_front<TPLT>::type>::type;

    public:
        using type = typename push_back<tl_result_rec, tl_first_elem>::type;
    };
    //无元素
    template <typename TPLT>
    class reverse<TPLT, true>
    {
    public:
        using type = typename TPLT;//此时为typelist<>
    };
}
using TPL_NM1 = tplt::typelist<int, double, float, char, bool>;
using TPL_NM2 = tplt::typelist<>;


namespace tplt2
{
    class  NullTypelist{};
    template <typename T, typename U = NullTypelist>
    class Typelist
    {
    public:
        using Head = T;
        using Tail = U;

    private:
    };

    template<typename TPLT>
    class front
    {
    public:
        using type = typename TPLT::Head;
    };

    template <typename TPLT>
    class size;

    template<>
    class size<NullTypelist>
    {
    public:
        static inline size_t value = 0;
    };

    template<typename T, typename U>
    class size<Typelist<T, U>>
    {
    public:
        static inline size_t value = size<U>::value + 1;
    };


    template <typename TPLT>
    class pop_front
    {
    public:
        using type = typename TPLT::Tail;
    };

    template <typename TPLT, typename NewElem>
    class push_front
    {
    public:
        using type = Typelist<NewElem, TPLT>;
    };
    template <typename TPLT, typename NewElem>
    class push_back
    {
    public:
        using type = Typelist<TPLT, NewElem>;
    };

    template <typename TPLT>
    class is_empty
    {
    public:
        static inline const bool value = false;
    };
    template <>
    class is_empty<NullTypelist>
    {
    public:
        static inline const bool value = true;
    };

    //template <typename TPLT, unsigned int index>
    //class find : public find<typename pop_front<TPLT>::type, index - 1>
    //{
    //};

    //template <typename TPLT>
    //class find<TPLT, 0> : public front<TPLT>
    //{
    //public:

    //};


    template <typename TPLT, unsigned int index>
    class find;
    template <typename Head, typename Tail>
    class find<Typelist<Head, Tail>, 0>
    {
    public:
        using type = Head;
    };
    template <typename Head, typename Tail, unsigned int index>
    class find<Typelist<Head, Tail>, index>
    {
    public:
        using type = typename find<Tail, index - 1>::type;
    };
    

    template <typename TPLT, unsigned int index, typename defaultType = NullTypelist>
    class find_nostrict
    {
    public:
        using type = defaultType;
    };

    template <typename Head, typename Tail, typename defaultType>
    class find_nostrict<Typelist<Head, Tail>, 0, defaultType>
    {
    public:
        using type = Head;
    };
    template <typename Head, typename Tail, unsigned int index, typename defaultType>
    class find_nostrict<Typelist<Head, Tail>, index, defaultType>
    {
    public:
        using type = typename find_nostrict<Tail, index -1, defaultType>::type;
    };


    template <typename Args>
    class TestTPCloass
    {
    public:
        using arg1 = typename find_nostrict<Args, 0>::type;
        using arg2 = typename find_nostrict<Args, 1>::type;
        using arg3 = typename find_nostrict<Args, 2>::type;
        void func(arg1 v1, arg2 v2)
        {
            cout << v1 + v2 << endl;
        }
    };
}
#define MAC_TYPELIST1(T1)               tplt2::Typelist<T1, tplt2::NullTypelist>
#define MAC_TYPELIST2(T1, T2)           tplt2::Typelist<T1, MAC_TYPELIST1(T2)>
#define MAC_TYPELIST3(T1, T2, T3)       tplt2::Typelist<T1, MAC_TYPELIST2(T2, T3)>
#define MAC_TYPELIST4(T1, T2, T3, T4)   tplt2::Typelist<T1, MAC_TYPELIST3(T2, T3, T4)>

using TPL_NM3 = MAC_TYPELIST3(int, double, char);

int main()
{
    std::cout << typeid(tplt::front<TPL_NM1>::type).name() << std::endl;
    std::cout << tplt::size<TPL_NM1>::value << std::endl;
    std::cout << typeid(tplt::pop_front<TPL_NM1>::type).name() << std::endl;
    std::cout << typeid(tplt::push_front<TPL_NM1, bool>::type).name() << std::endl;
    std::cout << typeid(tplt::push_back<TPL_NM1, bool>::type).name() << std::endl;
    std::cout << typeid(tplt::replace_front<TPL_NM1, bool>::type).name() << std::endl;
    std::cout << typeid(tplt::is_empty<TPL_NM1>::value).name() << std::endl;
    std::cout << typeid(tplt::find<TPL_NM1, 2>::type).name() << std::endl;
    std::cout << typeid(tplt::get_maxsize_type<TPL_NM1>::type).name() << std::endl;
    std::cout << typeid(tplt::reverse<TPL_NM1>::type).name() << std::endl;

    cout << typeid(tplt2::front<TPL_NM3>::type).name() << endl;
    cout << tplt2::size<TPL_NM3>::value << endl;
    cout << typeid(tplt2::pop_front<TPL_NM3>::type).name() << endl;
    cout << typeid(tplt2::push_back<TPL_NM3, bool>::type).name() << endl;

    cout << tplt2::is_empty<TPL_NM3>::value << endl;

    cout << typeid(tplt2::find<TPL_NM3, 1>::type).name() << endl;

    cout << typeid(tplt2::find_nostrict<TPL_NM3, 1>::type).name() << endl;
    cout << typeid(tplt2::find_nostrict<TPL_NM3, 5>::type).name() << endl;

    tplt2::TestTPCloass<TPL_NM3> obj;
    obj.func(18, 19);
    
    return 0;
}

get_maxsize_type 展开关系如下图

reverse//如下

C++ 使用模板实现一个List的实例 主要介绍了 C++ 使用模板实现一个List的实例的相关资料,需要的朋友可以参考下 立即下载

相关推荐

Monocle2在R 4.3环境下的终极避坑指南:从安装到可视化全流程解析

本文提供了在R 4.3环境下安装和运行Monocle2的完整解决方案,重点解决了依赖包兼容性、源码修改及BEAM分析报错等关键问题。文章详细解析了从环境准备、依赖包处理、源码安装验证到从Seurat对象转换、拟时轨迹构建、高级可视化及性能优化的全流程,旨在帮助用户顺利完成单细胞拟时分析。

weixin_29206669的博客 1355

跟我学c++高级篇——模板元编程之七typelist

对元编程中的typelist进行分析说明

fpcc的专栏 931

2026 最新实战教程:AI 重构开发全流程(从需求→上线→运维)

1)做什么系统2)技术栈3)功能模块4)部署要求plaintext我要做一个:待办事项(Todo)全栈应用技术栈:前端:React + TypeScript + Tailwind后端:Node.js + Express + MongoDB部署:Docker + 本地运行(后续可上云)功能:- 增删改查任务- 任务状态切换(完成/未完成)- 简单错误处理请按企业级标准生成:架构设计 + 全部代码 + 接口文档 + 启动命令。

qq_35779316的博客 1695

【C++泛型编程】Typelists型别工具

Typelists是一个用来操作一大群型别的C++工具,就像lists对数值提供各种基本操作一样。 1.定义Typelists            Typelist是以一种特殊的型别结束:NullType class NullType {}; struct EmptyType {}; // could be instantiated template st

xiaoding133的专栏【Stay hungry,Stay foolish】 1537

深入理解HTTPS:从SSLHandshakeException到证书链验证的完整解析

本文深入解析了HTTPS握手过程中常见的SSLHandshakeException异常,特别是由证书链验证失败引发的CertPathValidatorException。文章从TLS握手流程、证书链验证的数学原理出发,详细剖析了Java中TrustManager的工作机制,并提供了针对证书链不完整、自签名证书等典型问题的系统化排查流程与实战解决方案。

weixin_29313423的博客 231

Xilinx XDMA IP核配置实战:AXI Memory Mapped vs Stream选型指南(附PCIe调试技巧)

本文深入解析Xilinx XDMA IP核配置中AXI Memory Mapped与AXI Stream两种DMA接口的核心区别与选型策略。针对PCIe高速数据传输场景,详细对比了二者在数据特性、延迟、硬件资源及软件复杂度上的差异,为FPGA工程师在数据采集、实时处理等项目中做出高效设计决策提供实战指南,并附有关键的PCIe调试技巧。

qsc901234的博客 585

c++-模板元编程TypeList定义及基本操作

#include <iostream> #include <boost/type_index.hpp> using namespace std; /* TypeList 及 Typelist 的基本操作 1. typelist 2. front 3. popfront 4. pushront 5. pushback 6. reverse 7. popback 8. size 9. nth_element 10. IsEmpty; */ template<typename

qq_34179431的博客 563

华为OD机试:查找接口成功率最优时间段 (C/C++/Py/Java/JS/GO)

华为OD机试双机位C卷 查找接口成功率最优时间段,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。

qq_45776114的博客 4687

【元编程】老式typelist的实现

typelist//空的typelistpublic:为了后续方便,使用宏定义先预定义一些typelist//宏定义简短嵌套代码。

Antonio915的博客 1070

【异常】OpenClaw 项目 `fetch failed` 报错问题排查与解决方案Response interrupted: TypeError: fetch failed

针对无超时控制、异常兜底缺失导致的请求中断,封装标准化的安全请求工具,一次性解决超时控制、异常捕获、日志埋点三大问题,全项目替换原生。:将项目运行的 Node.js 版本升级至 18.x 及以上 LTS 版本,使用 Node.js 内置的稳定版。实现的网络请求环节,包括但不限于:第三方开放接口调用、内部服务接口通信、跨域资源请求、外部配置拉取等场景。:针对无法升级 Node.js 版本的存量环境,通过社区稳定兼容包替换原生。类型异常,直接造成业务请求响应中断。第二步:业务代码改造,替换原生。

奶爸的编程之路,也就一周冷个三天 367

【unity实战】Unity2D TileMap的探究(最简单,最全面的TileMap使用介绍)

之前有人在微信上找我,问了TileMap相关的知识【unity实战】随机地下城生成2——绘制地图Tilemap的使用及一些技巧的使用(含源码)不过写的不是特别不是特别细致,只是简单的用了一下,所有这次特地打算单独写一篇文章,来介绍一下,下次还有人问我,我直接就把这篇文章丢给他,完美!Unity的Tilemap 一般称之为瓦片地图或者平铺地图,是 Unity2017 中新增的功能,主要用于快速编辑 2D 游戏中的场景,通过复用资源的形式提升地图多样性。Tilemap是一个用于创建2D地图的工具。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1万+

C++用宏实现类成员反射

这里我们使用宏来实现了结构体(或类)成员的反射,包括成员的个数,成员的指针,成员的类型。有了这些我们就可以做一些基本的操作了,比如说一些序列化结构体等等。同时我们还展示了TypeList及相关的简单操作。当然你如果需要的话,也可以将TypeList操作丰富起来。

leapmotion的博客 1636

【Settings随记:二】一级菜单,二级菜单的添加与隐藏,添加辅助功能

首先会去调用父类的onCreatePreferences(Bundle savedInstanceState, String rootKey)方法,然后调用addPreferencesFromResource(R.xml.assistant_function)方法(这个方法是父类的)加载二级菜单的xml配置文件,实现创建二级菜单,这个配置文件路径在res/xml/assistant_function.xml。controller:该item的控制器,控制它的内容展示,是否可用,也可以控制它的点击事件等。

镇元子的博客 1595

(C++模板编程):typelist实现(类型计算的范例)

typelist实现(类型计算的范例) 【基本介绍】 《Modern C++ Design》 ---《C++设计新思维》-- Loki实现了typelist(列表头+嵌套列表技术来实现,因为2003年C++不支持可变参模板) typelist:用来操作一大堆类型的C++容器,就象C++标准库中的list容器(能够对各种数值提供各种基本操作),但typelist是针对类型进行操作。 typelist简单的说就是一个类型容器,能够对类型提供一系列的操作(把类型当成数据来操作)。 从实现上,typel

baidu_41388533的博客 2259

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C++ type list 模板

【代码】C++ type list 模板。

站在树顶端设计的男人 561

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Type List(C++ 模板元编程)

C++模板列表,提供一些编译期可操作函数

lifehappy 1000

C++: TypeList(编译期的类型列表)

C++中的TypeList是一种编译期类型数据结构,用于模板元编程中的类型集合操作。摘要如下: 基本概念 TypeList是编译期类型容器,仅存储类型信息而不占用运行时内存 通过模板类实现,如template<typename...Ts> struct TypeList{}; 核心操作 访问:获取类型列表长度、索引特定位置类型 查询:检查类型包含、查找类型索引 修改:追加/删除类型、类型映射转换 组合:连接类型列表、分割列表 典型应用 生成访问者模式实现 工厂模式类型管理 序列化框架开发 类型安

红军不怕远征难,万水千山只等闲 1450

【元编程】typelist的实现

typelisttypelisttypelist这个概念比较系统的出现是在ModernCDesignModernCDesign一书中,关于typelisttypelisttypelist的解释,就是用来操作一大堆类型的CC++C容器,就像std::list一样能够为数值提供各自操作一样,不过这里操作的是类型,而不是数值。这里,基于C11C++11C11以上的标准实现typ。

Antonio915的博客 1227

type_list在现代C++中的妙用,90%的资深工程师都忽略的关键细节

掌握C++模板元编程的type_list,轻松实现编译期类型安全与高效抽象。适用于泛型库设计、反射系统构建等场景,通过递归展开与模式匹配提升性能。揭示90%工程师忽略的关键细节,值得收藏。

InitFlow的博客 423

type_list完全指南,彻底搞懂C++编译期类型列表的底层机制

掌握C++模板元编程的type_list,彻底理解编译期类型列表的实现机制。涵盖类型查询、转换与算法操作,适用于泛型库设计与编译期优化。核心方法清晰解析,提升代码效率与灵活性,值得收藏。

PixelGlow的博客 1102

C++模板编程——typelist的实现

本文主要介绍了使用元编程编写typelist,并给出了具体的可运行的代码。

T_killer_的博客 704

C++: TypeList

#include &lt;stdio.h&gt;#include &lt;typeinfo.h&gt;//// TypeList//template &lt;class T, class U&gt;struct TypeList{    typedef T Head;    typedef U Tail;};struct NullType{};#define TYPELIST_1(T1)     ...

weixin_34253126的博客 223

C++的list的函数

List 用法小结   结构体函数: 无参数的: list l ; 就是新建一个空的链表 1个参数的: list l ( n ) ; 就是建立一个有n个元素的链表,这些元素的值都是默认的 list l ( t ) // t是个list ; 就是建立一个和t一模一样的链表 2个参数的: list l ( n , x ) ; 就是建立一个有n个元素的链表,这些元素的值都初始化为

ynkdyx的专栏 502

详解c++---list介绍

c++中list常用接口介绍

qq_68695298的博客 8329

带你从源码理解List集合的equals方法

List利用equals方法去重的源码解释 提出问题 我们希望创建List<List<intger>> lists,不断往lists中添加list,但我们不希望出现重复的list 如何解决这个问题? 利用List中的contain方法 源码解释 首先我们查看ArrayList实现list接口有contain方法 里面调用了indexOf方法,并且返回值大于等于0时,返回true public boolean contains(Object o) { return

小菜鸡 671

c++ 泛型编程 之 TypeLists

完整代码 在  http://download.youkuaiyun.com/detail/zhuyingqingfen/8457091关于 C++ 泛型中的 TypeTraits ,参考 c++ 泛型编程 之 TypeTraits#ifndef TYPE_LISTS_H_ #define TYPE_LISTS_H_ #include #include #include "typetraits.h"

UnrealEngine4 、Delta3D、OSG 2689
上一篇: C++ (策略)
下一篇: C++ 学习 (tuple)
__网瘾少年
博客等级 码龄11年 122粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值