104 [&]<std::size_t... I>(std::index_sequence<I...>) {
105 (self().template handle_field<R, refl::field<R, I>>(obj), ...);
106 }(std::make_index_sequence<refl::field_count<R>>());
108 [&]<std::size_t... I>(std::index_sequence<I...>) {
109 (visit_obj_method<R, I>(obj), ...);
110 }(std::make_index_sequence<refl::method_count<R>>());
115 if constexpr (std::is_reference_v<typename Field::type>) {
116 const auto& it = Field::from_instance(obj);
117 self().handle_reference(it);
118 }
else if constexpr (std::is_pointer_v<typename Field::type>) {
119 const auto* it = Field::from_instance(obj);
120 self().handle_pointer(it);
122 const auto& it = Field::from_instance(obj);
123 self().handle_value(it);
185 if constexpr (std::same_as<T, char*>) {
187 }
else if constexpr (std::same_as<T, const char*>) {
189 }
else if constexpr (std::is_reference_v<T>) {
190 self().handle_reference(it);
191 }
else if constexpr (std::is_pointer_v<T>) {
192 self().handle_pointer(it);
193 }
else if constexpr (packtl::is_type<std::vector, T>::value) {
194 self().handle_iterable(it);
196 self().handle_iterable(it);
197 }
else if constexpr (packtl::is_type<std::list, T>::value) {
198 self().handle_iterable(it);
199 }
else if constexpr (packtl::is_type<std::deque, T>::value) {
200 self().handle_iterable(it);
201 }
else if constexpr (packtl::is_type<std::map, T>::value) {
202 self().handle_iterable(it);
203 }
else if constexpr (packtl::is_type<std::unordered_map, T>::value) {
204 self().handle_iterable(it);
205 }
else if constexpr (packtl::is_type<std::set, T>::value) {
206 self().handle_iterable(it);
207 }
else if constexpr (packtl::is_type<std::unordered_set, T>::value) {
208 self().handle_iterable(it);
209 }
else if constexpr (packtl::is_type<std::pair, T>::value) {
210 self().handle_tuple(it);
217 }
else if constexpr (packtl::is_type<std::weak_ptr, T>::value) {
218 if (not it.expired()) {
219 const auto* value = it.lock().get();
220 self().handle_value(*value);
223 self().handle_obj(it);