#pragma once #include #include class BaseObjectType { public: explicit BaseObjectType(const std::type_info &type_info) noexcept; auto operator==(const BaseObjectType &object_type) const noexcept -> bool; [[nodiscard]] auto hash() const noexcept -> std::size_t; [[nodiscard]] auto name() const noexcept -> std::string_view; private: const std::type_info &_type_info; }; template class ObjectType : public BaseObjectType { public: ObjectType() noexcept : BaseObjectType(typeid(Object)) {} }; class ObjectTypeHasher { public: auto operator()(const BaseObjectType &object_type) const noexcept -> std::size_t; };