#pragma once
#include <type_traits>
namespace refl {
	template <class T>
	concept _ReflCheck_Ctor = requires { T(); };
	template <class T>
	concept _ReflCheck_UClass = requires(typename T::MyUClass& cls) { T::BuildClass(cls); } ;
	template <class T>
	concept _ReflCheck_Ctor_NoUClass = _ReflCheck_Ctor<T> && !_ReflCheck_UClass<T>;
	//类型接口
	template<typename T>
	struct TypeInfoImpl;

	template<typename T>
	struct RealTypeImpl {
		using type = std::remove_cv_t<std::remove_reference_t<T>>;
	};
	template<typename T>
	struct RealTypeImpl<T&> {
		using type = std::remove_cv_t<T>*;
	};
	template<typename T>
	using TypeInfo = TypeInfoImpl<typename RealTypeImpl<T>::type>;
}