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