#ifndef BASE_CLASS_HPP #define BASE_CLASS_HPP #include namespace matador { /** * @brief Safely casts a given derived class to its base class * * @tparam Base The base class type * @tparam Derived The class type of the derived class * @param derived The derived object * @return The cast object */ template < class Base, class Derived> const Base* base_class(const Derived *derived) { static_assert(!std::is_same_v, "class Base must not be of same type as class Derived"); static_assert(std::is_base_of_v, "class Base must be base of class Derived"); return static_cast(derived); } /** * @brief Safely casts a given derived class to its base class * * @tparam Base The base class type * @tparam Derived The class type of the derived class * @param derived The derived object * @return The cast object */ template < class Base, class Derived> Base* base_class(Derived *derived) { static_assert(!std::is_same_v, "class Base must not be of same type as class Derived"); static_assert(std::is_base_of_v, "class Base must be base of class Derived"); return static_cast(derived); } } #endif /* BASE_CLASS_HPP */