70 template<
class,
template<
class...>
class Tmp>
73 template<
template<
class...>
class Tmp,
class...T>
74 class Types<Tmp<T...>> {
75 using Type = Tmp<T...>;
78 static void printOneType(OStream& os) {
79 if constexpr ( std::is_const_v<U> ) {
84 auto name = getTypeName<U>();
86 if constexpr ( std::is_lvalue_reference_v<U> ) {
88 }
else if constexpr ( std::is_rvalue_reference_v<U> ) {
94 static void print(OStream& os) {
95 Template<void, Tmp>::print(os);
96 constexpr auto n =
sizeof...(T);
98 if constexpr ( n == 0 ) {
99 os <<
" <no types>\n";
102 (... , printOneType<T>(os));
109 struct Template<V, std::variant> {
110 static void print(OStream& os) { os <<
"variant\n"; }
114 struct Template<V, std::tuple> {
115 static void print(OStream& os) { os <<
"tuple\n"; }
119 struct Template<V, ugmisc::type_list> {
120 static void print(OStream& os) { os <<
"type_list\n"; }
123 template<
class,
template<
class...>
class>
125 static void print(OStream& os) { os <<
"other\n"; }
129 TypesPrinter(OStream& os) : oStream(os) {}
130 TypesPrinter(
const TypesPrinter&) =
default;
131 TypesPrinter(TypesPrinter&&) =
default;
134 const TypesPrinter& print()
const {
135 using PlainT = std::remove_cv_t<std::remove_reference_t<T>>;
136 Types<PlainT>::print(oStream);
141 const TypesPrinter& print(T&&)
const {
146 const TypesPrinter& operator()()
const {