in include/ylt/struct_pack/type_calculate.hpp [860:899]
constexpr auto get_types() {
using T = remove_cvref_t<U>;
if constexpr (user_defined_serialization<T>) {
return declval<std::tuple<T>>();
}
else if constexpr (std::is_fundamental_v<T> || std::is_enum_v<T> ||
varint_t<T> || string<T> || container<T> ||
ylt::reflection::optional<T> || unique_ptr<T> ||
is_variant_v<T> || ylt::reflection::expected<T> ||
array<T> || c_array<T> ||
std::is_same_v<std::monostate, T> || bitset<T>
#if (__GNUC__ || __clang__) && defined(STRUCT_PACK_ENABLE_INT128)
|| std::is_same_v<__int128, T> ||
std::is_same_v<unsigned __int128, T>
#endif
) {
return declval<std::tuple<T>>();
}
else if constexpr (tuple<T>) {
return declval<T>();
}
else if constexpr (is_trivial_tuple<T>) {
return declval<T>();
}
else if constexpr (pair<T>) {
return declval<
std::tuple<typename T::first_type, typename T::second_type>>();
}
else if constexpr (std::is_class_v<T>) {
// clang-format off
return visit_members(
declval<T>(), [](auto &&... args) constexpr {
return declval<std::tuple<remove_cvref_t<decltype(args)>...>>();
});
// clang-format on
}
else {
static_assert(!sizeof(T), "the type is not supported!");
}
}