41 lines
1.2 KiB
C++
41 lines
1.2 KiB
C++
#ifndef BASE_CLASS_HPP
|
|
#define BASE_CLASS_HPP
|
|
|
|
#include <type_traits>
|
|
|
|
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<Base, Derived>, "class Base must not be of same type as class Derived");
|
|
static_assert(std::is_base_of_v<Base, Derived>, "class Base must be base of class Derived");
|
|
return static_cast<const Base*>(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<Base, Derived>, "class Base must not be of same type as class Derived");
|
|
static_assert(std::is_base_of_v<Base, Derived>, "class Base must be base of class Derived");
|
|
return static_cast<Base*>(derived);
|
|
}
|
|
|
|
}
|
|
|
|
#endif /* BASE_CLASS_HPP */
|