#include <iostream>
#include <utility>
#include <string>
#include <cstring>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <numeric>
#include <boost/type_index.hpp>
using namespace std;
#include "def.h"
// 辅助类
template<typename T>
struct Identity {
using type = T;
};
template<typename List, template<class, class> typename Compare, typename Elem, bool = IsEmpty_v<List>>
struct InsertSort_;
template<typename List, template<class, class> typename Compare, typename Elem>
using InsertSort_t = typename InsertSort_<List, Compare, Elem>::type;
template<typename List, template<class, class> typename Compare, typename Elem>
struct InsertSort_<List, Compare, Elem, false> {
private:
using Front = Front_t<List>;
using NewTail = typename conditional_t<Compare<Elem, Front>::value, Identity<List>, InsertSort_<PopFront_t<List>, Compare, Elem>>::type;
using NewHead = conditional_t<Compare<Elem, Front>::value, Elem, Front>;
public:
using type = PushFront_t<NewTail, NewHead>;
};
template<typename List, template<class, class> typename Compare, typename Elem>
struct InsertSort_<List, Compare, Elem, true> {
using type = PushFront_t<List, Elem>;
};
template<typename List, template<class, class> typename Compare, bool = IsEmpty_v<List>>
struct InsertionSort_ {
using NewTail = typename InsertionSort_<PopFront_t<List>, Compare>::type;
using NewHead = Front_t<List>;
using type = InsertSort_t<NewTail, Compare, NewHead>;
};
template<typename List, template<class, class> typename Compare>
struct InsertionSort_<List, Compare, true> {
using type = List;
};
template<typename List, template<class, class> typename Compare>
using InsertionSort_t = typename InsertionSort_<List, Compare>::type;
struct Big {
char buffer[1024];
};
template<typename T, typename U>
struct LessBigger {
constexpr static auto value = sizeof(T) < sizeof(U);
};
int main() {
using SL = TypeList<long long, Big, bool, char, int, short>;
using Sorted_SL = InsertionSort_t<SL, LessBigger>;
cout << boost::typeindex::type_id_with_cvr<Sorted_SL>().pretty_name() << endl;
}
输出