Loading...
Searching...
No Matches
IsTemplate.hpp
1#pragma once
2#include <score/config.hpp>
3
4#include <cinttypes>
5#include <type_traits>
6
7// Check
8// https://stackoverflow.com/questions/39812789/is-there-any-way-of-detecting-arbitrary-template-classes-that-mix-types-and-non
9// again with c++20
10template <class T>
11struct is_template : std::false_type
12{
13};
14
15template <template <class...> class T, class... Args>
16struct is_template<T<Args...>> : std::true_type
17{
18};
19
20template <template <auto...> class T, auto... Args>
21struct is_template<T<Args...>> : std::true_type
22{
23};
24
25template <template <class, auto, auto...> class T, class Arg1, auto Arg2, auto... Arg3>
26 requires(sizeof...(Arg3) > 0)
27struct is_template<T<Arg1, Arg2, Arg3...>> : std::true_type
28{
29};
30template <template <auto, class, class...> class T, auto Arg1, class Arg2, class... Arg3>
31 requires(sizeof...(Arg3) > 0)
32struct is_template<T<Arg1, Arg2, Arg3...>> : std::true_type
33{
34};
35
36template <template <class, auto, class> class T, class Arg1, auto Arg2, class Arg3>
37struct is_template<T<Arg1, Arg2, Arg3>> : std::true_type
38{
39};
40
41template <
42 template <class, auto, class, class> class T, class Arg1, auto Arg2, class Arg3,
43 class Arg4>
44struct is_template<T<Arg1, Arg2, Arg3, Arg4>> : std::true_type
45{
46};
47
48template <
49 template <class, auto, class, class, class> class T, class Arg1, auto Arg2,
50 class Arg3, class Arg4, class Arg5>
51struct is_template<T<Arg1, Arg2, Arg3, Arg4, Arg5>> : std::true_type
52{
53};
54template <template <auto, class, auto> class T, auto Arg1, class Arg2, auto Arg3>
55struct is_template<T<Arg1, Arg2, Arg3>> : std::true_type
56{
57};
58
59template <
60 template <class, class, class, class, auto, auto, class> class T, class A1, class A2,
61 class A3, class A4, auto A5, auto A6, class A7>
62struct is_template<T<A1, A2, A3, A4, A5, A6, A7>> : std::true_type
63{
64};
65
66template <
67 template <class, class, class, class, class, auto, auto, class> class T, class A1,
68 class A2, class A3, class A4, class A5, auto A6, auto A7, class A8>
69struct is_template<T<A1, A2, A3, A4, A5, A6, A7, A8>> : std::true_type
70{
71};
72
73template <template <class, auto> class T, class X, auto u>
74struct is_template<T<X, u>> : std::true_type
75{
76};
77
78template <template <class, class, bool> class T, class A, class B, bool C>
79struct is_template<T<A, B, C>> : std::true_type
80{
81};
82
83template <
84 template <class, class, class, class, class, class, bool> class T, class A1,
85 class A2, class A3, class A4, class A5, class A6, bool B>
86struct is_template<T<A1, A2, A3, A4, A5, A6, B>> : std::true_type
87{
88};
89
90template <
91 template <class, class, class, class, class, class, class, bool> class T, class A1,
92 class A2, class A3, class A4, class A5, class A6, class A7, bool B>
93struct is_template<T<A1, A2, A3, A4, A5, A6, A7, B>> : std::true_type
94{
95};
96
97template <class>
98struct is_custom_serialized : std::false_type
99{
100};
STL namespace.