#ifndef ISDERIVEDFROM_H_ #define ISDERIVEDFROM_H_ /** * These template type checks are based on SFINAE * (https://en.cppreference.com/w/cpp/language/sfinae) * * @tparam D Derived Type * @tparam B Base Type */ template class IsDerivedFrom { class No { }; class Yes { No no[3]; }; // This will be chosen if B is the base type static Yes Test(B*); // declared, but not defined // This will be chosen for anything else static No Test(... ); // declared, but not defined public: enum { Is = sizeof(Test(static_cast(0))) == sizeof(Yes) }; }; template struct is_same { static bool const value = false; }; template struct is_same { static bool const value = true; }; template struct enable_if { typedef T type; }; template struct enable_if { }; #endif /* ISDERIVEDFROM_H_ */