The following is a wild, not fully tested attempt to do something useful only with C ++ 11 (in fact, it does not actually require any C ++ 11 function, but itโs easier to write this way).
However, this trait only verifies the transient closure of the โprimary base classโ property: I could not understand the non-intrusive way of checking whether a class is a direct base class of another class.
#include <type_traits> template<typename B, typename D, D* p = nullptr, typename = void> struct is_primary_base_of : std::false_type { }; template<typename B, typename D, D* p> struct is_primary_base_of<B, D, p, typename std::enable_if< ((int)(p + 1024) - (int)static_cast<B*>(p + 1024)) == 0 >::type > : std::true_type { };
Here is an example:
struct A { virtual ~A() { } }; struct B : A { }; struct C { virtual ~C() { } }; struct D : B, C { }; struct E : virtual A, C { }; int main() { // Does not fire (A is PBC of B, which is PBC of D) static_assert(is_primary_base_of<A, D>::value, "Error!"); // Does not fire (B is PBC of C) static_assert(is_primary_base_of<B, D>::value, "Error!"); // Fires (C is not PBC of D) static_assert(is_primary_base_of<C, D>::value, "Error!"); // Fires (A is inherited virtually by E, so it is not PBC of E) static_assert(is_primary_base_of<A, E>::value, "Error!"); // Does not fire (C is the first non-virtual base class of E) static_assert(is_primary_base_of<C, E>::value, "Error!"); }
Andy prowl
source share