#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IEEgeyB9OwpzdHJ1Y3QgQiA6IHB1YmxpYyBBIHsgdHlwZWRlZiBBIEJhc2U7IH07CnN0cnVjdCBDIDogcHVibGljIEIge307Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdHJ1Y3QgdG9fdm9pZAp7Cgl0eXBlZGVmIHZvaWQgdHlwZTsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBkdW1teSA9IHZvaWQ+CnN0cnVjdCBoYXNfYmFzZV90eXBlZGVmIDogc3RkOjpmYWxzZV90eXBlIHt9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBoYXNfYmFzZV90eXBlZGVmPFQsIHR5cGVuYW1lIHRvX3ZvaWQ8dHlwZW5hbWUgVDo6QmFzZT46OnR5cGU+IDogc3RkOjp0cnVlX3R5cGUge307CgppbnQgbWFpbigpCnsKCXN0ZDo6Y291dCA8PCBoYXNfYmFzZV90eXBlZGVmPEE+Ojp2YWx1ZTsKCXN0ZDo6Y291dCA8PCBoYXNfYmFzZV90eXBlZGVmPEI+Ojp2YWx1ZTsKCXN0ZDo6Y291dCA8PCBoYXNfYmFzZV90eXBlZGVmPEM+Ojp2YWx1ZTsKfQ==