У вас есть доступ к компилятору с поддержкой C ++ 11?
Если это так, вы можете объединить использование Чадом static_cast
с decltype
для создания очень простой реализации черты типа (как показано в в этом вопросе ). Согласно предложению Джонатана Уэйкли, ссылки были заменены указателями, чтобы избежать ложных срабатываний, когда D
определяет operator B&()
.
template<typename> struct AnyReturn { typedef void type; };
template<typename B, typename D, typename Sfinae = void>
struct is_base_of: std::false_type {};
template<typename B, typename D>
struct is_base_of<B, D,
typename AnyReturn< decltype( static_cast<B*>( std::declval<D*>() ) ) >::type
>: std::true_type {};
При использовании gcc 4.7:
struct Base {};
struct PublicDerived : public Base {};
struct PrivateDerived : private Base {};
int main()
{
std::cout << is_base_of<Base, PublicDerived >::value << std::endl; // prints 1
std::cout << is_base_of<Base, PrivateDerived>::value << std::endl; // prints 0
return 0;
}