meta::derived_from

Defined in header <mgs/meta/concepts/derived_from.hpp>.

template <typename Derived, typename Base>
concept derived_from =
   meta::complete_type<Derived> &&
   std::is_base_of_v<Base, Derived> &&
   std::is_convertible_v<Derived const volatile*, Base const volatile*>;

Pre-C++20 implementation of the std::derived_from concept.


Concept emulation

namespace mgs {
namespace meta {

template <typename Derived, typename Base>
struct is_derived_from { /* ... */ };

template <typename Derived, typename Base>
constexpr auto is_derived_from_v = is_derived_from<Derived, Base>::value;

template <typename Derived, typename Base,
          typename = std::enable_if_t<is_derived_from_v<Derived, Base>>
using DerivedFrom = Derived;

} // namespace meta
} // namespace mgs

Example

#include <mgs/meta/concepts/derived_from.hpp>

using namespace mgs::meta;

struct A {};
struct B : A {};

static_assert(is_derived_from_v<B, A>, "");
static_assert(is_derived_from_v<A, A>, "");
static_assert(!is_derived_from_v<A, B>, "");