constexpr auto get_types()

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!");
  }
}