#include <iostream>

struct A { };
struct B : public A { typedef A Base; };
struct C : public B {};

template<typename T>
struct to_void
{
	typedef void type;
};

template <typename T, typename dummy = void>
struct has_base_typedef : std::false_type {};

template <typename T>
struct has_base_typedef<T, typename to_void<typename T::Base>::type> : std::true_type {};

int main()
{
	std::cout << has_base_typedef<A>::value;
	std::cout << has_base_typedef<B>::value;
	std::cout << has_base_typedef<C>::value;
}