51 lines
922 B
C++
51 lines
922 B
C++
#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<typename D, typename B>
|
|
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<D*>(0))) == sizeof(Yes)
|
|
};
|
|
};
|
|
|
|
template<typename, typename>
|
|
struct is_same {
|
|
static bool const value = false;
|
|
};
|
|
|
|
template<typename A>
|
|
struct is_same<A, A> {
|
|
static bool const value = true;
|
|
};
|
|
|
|
|
|
template<bool C, typename T = void>
|
|
struct enable_if {
|
|
typedef T type;
|
|
};
|
|
|
|
template<typename T>
|
|
struct enable_if<false, T> { };
|
|
|
|
|
|
#endif /* ISDERIVEDFROM_H_ */
|