#include #include using namespace std; using namespace struct_pack; using UniversalVectorType = detail::UniversalVectorType; using UniversalType = detail::UniversalType; using UniversalOptionalType = detail::UniversalOptionalType; using UniversalIntegralType = detail::UniversalIntegralType; using UniversalNullptrType = detail::UniversalNullptrType; using UniversalCompatibleType = detail::UniversalCompatibleType; /* 获取对象成员数量 */ template struct is_constructable_impl : std::false_type {}; template struct is_constructable_impl < T, construct_param_t, std::void_t< decltype(T{ {Args{}}..., {construct_param_t{}} }) > , Args... > : std::true_type {}; template constexpr bool is_constructable = is_constructable_impl::value; template constexpr std::size_t members_count_impl() { if constexpr (is_constructable) { return members_count_impl(); } else if constexpr (is_constructable) { cout << "is_constructable UniversalType \n"; return members_count_impl(); } return sizeof...(Args); } /* 获取成员类型 */ template concept type_string = requires(Type container) { requires detail::is_char_t::value_type>; container.length(); container.data(); }; template concept type_struct = requires(Type container) { requires std::is_class_v; }; template concept type_u32 = requires(Type container) { requires sizeof(Type) == 4; }; /* 获取成员信息 */ template constexpr void visit_one_member_info(T& item) { constexpr auto id = detail::get_type_id(); cout << "visit_one_member_info::" << (int)id << "=" << item << "\n"; } template void visit_member_info(Args&...args) { cout << "visit_member_info::" << sizeof...(args) << "\n"; (visit_one_member_info(args), ...); } template void visit_struct_info(T& item) { int count = members_count_impl(); auto visitor = [](auto&&... items) { visit_member_info<>(items...); }; if (count == 4) { auto&& [a1, a2, a3, a4] = item; visitor(a1, a2, a3, a4); } }