#include <iostream>
struct has_member_type_impl
{
template <typename T> static std::true_type snifae(typename T::type *);
template <typename T> static std::false_type snifae(...);
};
template <typename T>
using has_member_type = decltype(has_member_type_impl::snifae<T>(nullptr));
struct test
{
using type = void;
};
int main() {
std::cout << has_member_type<int>::value << std::endl;
std::cout << has_member_type<test>::value << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IGhhc19tZW1iZXJfdHlwZV9pbXBsCnsKCXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdGF0aWMgc3RkOjp0cnVlX3R5cGUgc25pZmFlKHR5cGVuYW1lIFQ6OnR5cGUgKik7Cgl0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RhdGljIHN0ZDo6ZmFsc2VfdHlwZSBzbmlmYWUoLi4uKTsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgp1c2luZyBoYXNfbWVtYmVyX3R5cGUgPSBkZWNsdHlwZShoYXNfbWVtYmVyX3R5cGVfaW1wbDo6c25pZmFlPFQ+KG51bGxwdHIpKTsKCnN0cnVjdCB0ZXN0CnsKCXVzaW5nIHR5cGUgPSB2b2lkOwp9OwoKaW50IG1haW4oKSB7CglzdGQ6OmNvdXQgPDwgaGFzX21lbWJlcl90eXBlPGludD46OnZhbHVlIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCBoYXNfbWVtYmVyX3R5cGU8dGVzdD46OnZhbHVlIDw8IHN0ZDo6ZW5kbDsKCXJldHVybiAwOwp9