将一个数据列表按照要求尽心分割为两个类型。
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