首页 > 编程语言 >模板元编程--TypeList算法--类型分割

模板元编程--TypeList算法--类型分割

时间:2023-05-11 15:12:49浏览次数:49  
标签:struct typename -- TypeList template using type 模板

将一个数据列表按照要求尽心分割为两个类型。

using list1 = TypeList<char, double, float, long long, int, int>;

将大于4字节的分为一组,其他分为一组:

贴入Fold函数,一会儿用到:

template<typename T>
concept TL = requires{
    typename T::isTypeList;
    typename T::type;
};

template<typename... Ts>
struct TypeList {

    struct isTypeList{};
    using type = TypeList<Ts...>;
    constexpr static size_t size = sizeof...(Ts);

    // 成员元函数,在列表的尾部添加元素
    template<typename... T>
    using append = TypeList<Ts..., T...>;
    // 成员元函数,在列表的头部添加元素
    template<typename... T>
    using prepend = TypeList<T..., Ts...>;
    // 成员元函数,将该列表转换为其他模板类
    template<template<typename...> typename T>
    using to = T<Ts...>;
};

template<typename T>
struct Return { using type = T; };

template<TL in,typename Init,template<typename,typename> class P>
struct Fold:Return<Init>{};

template<typename Init,template<typename,typename> class P,typename T,typename... Ts>
struct Fold<TypeList<T,Ts...>,Init,P>:Fold<TypeList<Ts...>,typename P<Init,T>::type,P>{};

实现这个算法,通过使用P来判定类型是否符合要去,符合要求的加入到一个空列表中,那么相对而言,取反后就是另一个类型列表:

template<TL in,template<typename,typename> typename P>
struct partition {
    template<TL out,typename T>
    using fun = std::conditional_t<!P<out, T>::value, out,typename out::template append<T>>;
    struct type {
        using Statisfied = Fold<in, TypeList<>, P>;
        using Rest = Fold<in, TypeList<>, fun>;
    };
};

算法通过type保存了两个数据结构,

实现P:

template<TL in,typename T>
struct F {
    static constexpr bool value = (sizeof(T) > 4);
    using type = std::conditional_t<value, in,typename in::template append<T >> ;
};

调用:

  using list1 = TypeList<char, double, float, long long, int, int>;

    using we = partition<list1, F>::type::Rest::type;
    using wb = partition<list1, F>::type::Statisfied::type;

 

标签:struct,typename,--,TypeList,template,using,type,模板
From: https://www.cnblogs.com/Super-biscuits/p/17391083.html

相关文章

  • Python工具箱系列(三十一)
    Neo4j是一个高性能的开源的,使用Java语言实现的NoSQL图数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎......
  • spark-sql 启动客户端报错问题
    1.spark-sql启动报错java.lang.NoClassDefFoundError:org/apache/tez/dag/api/SessionNotRunning原因:在启动时找不到tez的jar包解决方法:将tez目录下的tez-api-0.9.1.jar复制一份到spark的jars目录下cptez-api-0.9.1.jar/usr/hdp/current/spark2-client/jars/分发到其他......
  • Vsftpd
    Vsftpd文件传输服务ftp是典型的C/S结构,由服务端跟客户端两个部分共同实现文件传输功能一、Ftp工作原理ftp采用TCP协议的20、21端口与客户端进行通信20端口:用于建立数据连接并传输文件数据21端口:用于建立控制连接,并传输ftp控制命令二、ftp的传输模式1、主动模式......
  • Unindent does not match any outer indentation level
    出现这个报错是因为格式有问题。查看是否正确缩进,有没有对齐,还有有没有tab和空格混用。可以打开notepad++来查看格式是否出现问题。1.下图的问题if前面有一个空格,应该删去。 2.前面都多出了一个空格,要删除。 3.这个也是因为多出了一个空格所以报错 ......
  • 符号概述
    数字\(x\)标量\(X\)向量\(\Chi\)矩阵......
  • 永磁同步电机的控制算法仿真模型: 1. 永磁同步电机的MRAS无
    永磁同步电机的控制算法仿真模型:1.永磁同步电机的MRAS无传感器矢量控制:2.永磁同步电机的SMO无传感器矢量控制(反正切+锁相环);3.永磁同步电机DTC直接转矩控制;4.永磁同步电机的有传感器矢量控制;5.永磁同步电机的位置控制ID:26186687291896135......
  • 【经验分享】在百度搜索引擎中的结果中,过滤指定的网站
    环境:系统版本:Windows10需求描述:描述:在搜索引擎中想在结果中过滤一些指定网站,快速找到有价值的内容。实现方法-视频与文字教程:视频教程:文字教程:1.进入百度搜索引擎,bing搜索引擎貌似不可以。www.baidu.com2.搜索内容如:锐捷无线AC基础命令-csdn,“-”这个符号是减号,0......
  • vue2+van2 实现带搜索的级联选择组件
    级联选择组件新建组件-子项CasadeSelect/CasadeSelectItem.vue<template><divclass="container-list-item"><divclass="icon"><divclass="checkbox"><svg-iconv-if="curChecked"ic......
  • Git 同步到新库
    进行git初始化 gitinit将本地代码添加到仓库 gitadd./注意有空格 gitcommit-m“上传仓库时的说明”关联上远程仓库 gitremoteaddoriginhttps://github.com/DavidCuii/react-ts-app.git最后将你的代码上传到Git库......
  • 异步电机的旋转高频电压注入算法FOC,全套C代码+仿真模型,已经在实际的工程项目项目中加
    异步电机的旋转高频电压注入算法FOC,全套C代码+仿真模型,已经在实际的工程项目项目中加以应用:1.在定子电压的两相同步静止坐标系(α,β轴)下注入旋转高频电压,然后通过转子位置观测器实现转子机械转速与转子磁链电角度的精确估算;2.能够实现电机低速段带重载运行工况下的高精度无传感器......