76 template<
class,
template<
class...>
class Tmp>
79 template<
template<
class...>
class Tmp,
class...T>
80 class Types<Tmp<T...>> {
81 using Type = Tmp<T...>;
84 static void printOneType(OStream& os) {
85 if constexpr ( std::is_const_v<U> ) {
92 if constexpr ( std::is_lvalue_reference_v<U> ) {
94 }
else if constexpr ( std::is_rvalue_reference_v<U> ) {
100 static void print(OStream& os) {
101 Template<void, Tmp>::print(os);
102 constexpr auto n =
sizeof...(T);
104 if constexpr ( n == 0 ) {
105 os <<
" <no types>\n";
108 (... , printOneType<T>(os));
115 struct Template<V, std::variant> {
116 static void print(OStream& os) { os <<
"variant\n"; }
120 struct Template<V, std::tuple> {
121 static void print(OStream& os) { os <<
"tuple\n"; }
125 struct Template<V, ugmisc::type_list> {
126 static void print(OStream& os) { os <<
"type_list\n"; }
129 template<
class,
template<
class...>
class>
131 static void print(OStream& os) { os <<
"other\n"; }
135 TypesPrinter(OStream& os) : oStream(os) {}
136 TypesPrinter(
const TypesPrinter&) =
default;
137 TypesPrinter(TypesPrinter&&) =
default;
140 const TypesPrinter& print()
const {
141 using PlainT = std::remove_cv_t<std::remove_reference_t<T>>;
142 Types<PlainT>::print(oStream);
147 const TypesPrinter& print(T&&)
const {
152 const TypesPrinter& operator()()
const {