#include "Reflection.h" #include #include namespace clice { template constexpr inline bool is_optional_v = false; template constexpr inline bool is_optional_v> = true; template constexpr inline bool is_vector_like_v = false; template constexpr inline bool is_vector_like_v> = true; template constexpr inline bool is_vector_like_v> = true; template void print(Object&& object) { using T = std::decay_t; if constexpr(std::is_same_v) { std::cout << (object ? "true" : "false") << std::endl; } else if constexpr(std::is_integral_v || std::is_floating_point_v || std::is_same_v || std::is_same_v) { std::cout << object << std::endl; } else if constexpr(std::is_enum_v) { std::cout << static_cast>(object) << std::endl; } else if constexpr(is_optional_v) { if(object.has_value()) { print(object.value()); } else { std::cout << "null" << std::endl; } } else if constexpr(is_vector_like_v) { std::cout << "[" << std::endl; for(auto&& value: object) { print(value); } std::cout << "]" << std::endl; } else { std::cout << "{" << std::endl; for_each(object, [&](auto&& name, auto&& value) { std::cout << name << ": "; print(value); }); std::cout << "}" << std::endl; } } } // namespace clice