#include <iostream>
struct foo1 { };
struct foo2 { typedef int bar; };
template<typename T>
class has_bar
{
typedef char yes;
typedef struct { yes no_[2]; } no;
static T make();
template<typename U>
static yes check(U&&, typename U::bar*);
template<typename U>
static no check(U&&, ...);
public:
enum { value = sizeof(check(make(), nullptr)) == sizeof(yes) };
};
int main()
{
std::cout
<< has_bar<foo1>::value << '\n'
<< has_bar<foo2>::value << '\n';
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IGZvbzEgeyB9OwpzdHJ1Y3QgZm9vMiB7IHR5cGVkZWYgaW50IGJhcjsgfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNsYXNzIGhhc19iYXIKewogICAgdHlwZWRlZiBjaGFyIHllczsKICAgIHR5cGVkZWYgc3RydWN0IHsgeWVzIG5vX1syXTsgfSBubzsKCiAgICBzdGF0aWMgVCBtYWtlKCk7CgogICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4KICAgIHN0YXRpYyB5ZXMgY2hlY2soVSYmLCB0eXBlbmFtZSBVOjpiYXIqKTsKICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+CiAgICBzdGF0aWMgbm8gY2hlY2soVSYmLCAuLi4pOwoKcHVibGljOgogICAgZW51bSB7IHZhbHVlID0gc2l6ZW9mKGNoZWNrKG1ha2UoKSwgbnVsbHB0cikpID09IHNpemVvZih5ZXMpIH07Cn07CgppbnQgbWFpbigpCnsKICAgIHN0ZDo6Y291dAogICAgICAgIDw8IGhhc19iYXI8Zm9vMT46OnZhbHVlIDw8ICdcbicKICAgICAgICA8PCBoYXNfYmFyPGZvbzI+Ojp2YWx1ZSA8PCAnXG4nOwp9