#include <iostream>
#include <type_traits>
#include <string>
struct has_member_type_impl
{
template <typename T> static std::true_type snifae(typename T::type *);
template <typename...> static std::false_type snifae(...);
};
template <typename T>
struct 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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CiNpbmNsdWRlIDxzdHJpbmc+CgpzdHJ1Y3QgaGFzX21lbWJlcl90eXBlX2ltcGwKewoJdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0YXRpYyBzdGQ6OnRydWVfdHlwZSBzbmlmYWUodHlwZW5hbWUgVDo6dHlwZSAqKTsKCXRlbXBsYXRlIDx0eXBlbmFtZS4uLj4gc3RhdGljIHN0ZDo6ZmFsc2VfdHlwZSBzbmlmYWUoLi4uKTsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgaGFzX21lbWJlcl90eXBlIDogZGVjbHR5cGUoaGFzX21lbWJlcl90eXBlX2ltcGw6OnNuaWZhZTxUPihudWxscHRyKSkge307CgpzdHJ1Y3QgdGVzdCB7IHVzaW5nIHR5cGUgPSB2b2lkOyB9OwoKaW50IG1haW4oKSB7CglzdGQ6OmNvdXQgPDwgaGFzX21lbWJlcl90eXBlPGludD46OnZhbHVlIDw8IHN0ZDo6ZW5kbDsKCXN0ZDo6Y291dCA8PCBoYXNfbWVtYmVyX3R5cGU8dGVzdD46OnZhbHVlIDw8IHN0ZDo6ZW5kbDsKCXJldHVybiAwOwp9