#pragma once #ifndef __FILE_Detail_Core_Object_Hpp #define __FILE_Detail_Core_Object_Hpp #include "detail/CP/Typen.hpp" /** * 所有object体系中的非实例类都不包含虚函数和数据结构, 并以私有方式继承 * @code * class Base : private Object{}; * class Derived : public Base, Object{}; */ template struct Object; template <> struct Object { template Object& ObjectCast() { return *static_cast*>(this); } }; template struct Object : private Object { using TDerivedTerminal = DerivedTerminal; constexpr DerivedTerminal* operator->() noexcept { return static_cast(this); } template || TIsConvertible || TIsBaseOf, TChoose, T, T&> > > R Cast() { if constexpr (std::is_base_of_v && std::has_virtual_destructor_v) return dynamic_cast(static_cast(*this)); else return *static_cast(this); } }; template struct IInterface; template struct IInterface: private Object> { protected: DataType data; public: virtual DataType& ReadValue() { return data; } }; template struct IInterface : private Object> { protected: DataType data; public: virtual const DataType& ReadValue() { return data; } }; template struct IInterface : private Object> { protected: DataType data; public: virtual void SetValue(DataType value) { data = value; } }; template struct IInterface : private Object> { protected: DataType data; }; template using ITypenInterface = IInterface::TypeHash>; #endif // !__FILE_Detail_Core_Object_Hpp