c+±模板元编程TypeList定义及基本操作
c+±模板元编程ValueList定义及基本操作
#include "def.h" #include "valueList.h" // select templatestruct Select_; template using Select_t = typename Select_ ::type; template
struct Select_ > { using type = TypeList
...>; }; void select_test() { using SignedIntegralTypes = TypeList ; using ReversedSignedIntegralTypes = Select_t >; cout << boost::typeindex::type_id_with_cvr ().pretty_name() << endl; } // select 实战 实现 insertionSort; 排序 index索引, 使用 Select生成目标结果 // 有序索引列表插入 template typename Compare, typename Elem, bool = IsEmpty_v > struct InsertSortedIndex_ { using Front = Front_t ; using Tail = typename conditional_t< Compare ::value, Identity
, InsertSortedIndex_ , Compare, Elem>>::type; using Head = conditional_t< Compare
::value, Elem, Front>; using type = PushFront_t
; }; template typename Compare, typename Elem> using InsertSortedIndex_t = typename InsertSortedIndex_ ::type; template
typename Compare, typename Elem> struct InsertSortedIndex_ { using type = PushFront_t
; }; // 排序索引 template typename Compare, bool = IsEmpty_v > struct InsertionIndexSort_ { using Front = Front_t ; using Tail = typename InsertionIndexSort_ , Compare>::type; using type = InsertSortedIndex_t
; }; template
typename Compare> struct InsertionIndexSort_ { using type = Indices; }; template
typename Compare, bool = IsEmpty_v > struct NewInsertionSort_ { using NewIndexes = typename InsertionIndexSort_
::type; using type = Select_t
; }; template
typename Compare> using NewInsertionSort_t = typename NewInsertionSort_ ::type; template
typename Compare> struct NewInsertionSort_ { using type = List; }; template
struct IndexCompare { // 按照类型的大小排序 constexpr static auto value = sizeof(NthElem_t ) < sizeof(NthElem_t
); }; template
auto makeTypeListIndices(index_sequence ) { return ValueList {}; } void insertionSort_test() { using SL = TypeList ; using Indices = decltype(makeTypeListIndices (make_index_sequence >())); // 排序 using Sortted = NewInsertionSort_t ; cout << boost::typeindex::type_id_with_cvr ().pretty_name() << endl; } int main() { select_test(); insertionSort_test(); }



