#include <iostream>
#include <type_traits>
using namespace std;
struct FooNo {};
struct FooYes { int x; };
struct FooDerivedYes : public FooYes {};
struct FooDerivedNo : public FooNo {};
struct FooDerivedTwiceYes final : public FooYes { int x; };
template <typename T, typename = void>
struct HasX : false_type { };
template <typename T>
struct HasX <T, decltype((void) T::x)> : true_type { };
int main() {
cout << HasX<FooYes>::value << endl;
cout << HasX<FooNo>::value << endl;
cout << HasX<FooDerivedYes>::value << endl;
cout << HasX<FooDerivedNo>::value << endl;
cout << HasX<FooDerivedTwiceYes>::value << endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IEZvb05vIHt9OwpzdHJ1Y3QgRm9vWWVzIHsgaW50IHg7IH07CgpzdHJ1Y3QgRm9vRGVyaXZlZFllcyA6IHB1YmxpYyBGb29ZZXMge307CnN0cnVjdCBGb29EZXJpdmVkTm8gOiBwdWJsaWMgRm9vTm8ge307CnN0cnVjdCBGb29EZXJpdmVkVHdpY2VZZXMgZmluYWwgOiBwdWJsaWMgRm9vWWVzIHsgaW50IHg7IH07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB2b2lkPgpzdHJ1Y3QgSGFzWCA6IGZhbHNlX3R5cGUgeyB9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBIYXNYIDxULCBkZWNsdHlwZSgodm9pZCkgVDo6eCk+IDogdHJ1ZV90eXBlIHsgfTsKCmludCBtYWluKCkgewogICAgY291dCA8PCBIYXNYPEZvb1llcz46OnZhbHVlIDw8IGVuZGw7CiAgICBjb3V0IDw8IEhhc1g8Rm9vTm8+Ojp2YWx1ZSA8PCBlbmRsOwogICAgY291dCA8PCBIYXNYPEZvb0Rlcml2ZWRZZXM+Ojp2YWx1ZSA8PCBlbmRsOwogICAgY291dCA8PCBIYXNYPEZvb0Rlcml2ZWRObz46OnZhbHVlIDw8IGVuZGw7CiAgICBjb3V0IDw8IEhhc1g8Rm9vRGVyaXZlZFR3aWNlWWVzPjo6dmFsdWUgPDwgZW5kbDsKfQ==