//User types
struct field_t{};
struct other_t{};
struct StructA{field_t field;};
struct StructB{other_t other;};
struct StructC:public StructA{};
struct StructD:public StructB{};
struct StructT{other_t field;field_t other;};
//Implementation detail
template<typename T,typename FIELD_T>
struct type_has_field{
struct Fallback {FIELD_T field;};
struct Derived:T,Fallback{};
template<typename C, C> struct ChT;
template<typename C> static char (&f(ChT<FIELD_T Fallback::*, &C::field>*))[1];
template<typename C> static char (&f(...))[2];
static bool const value = sizeof(f<Derived>(0)) == 2;
};
//Experiment
void UnitTest(){
static_assert(
true==type_has_field<StructA,field_t>::value,
"field_t StructA::field - should exist"
);
static_assert(
false==type_has_field<StructB,field_t>::value,
"field_t StructB::field - should not exist"
);
static_assert(
true==type_has_field<StructC,field_t>::value,
"field_t StructC::field - should exist"
);
static_assert(
false==type_has_field<StructD,field_t>::value,
"field_t StructD::field - should not exist"
);
static_assert(
false==type_has_field<StructT,field_t>::value,
"field_t StructT::field - should not exist"
);
static_assert(
true==type_has_field<StructT,other_t>::value,
"other_t StructT::field - should exist"
);
}
int main(){return 0;}
Ly9Vc2VyIHR5cGVzCnN0cnVjdCBmaWVsZF90e307CnN0cnVjdCBvdGhlcl90e307CnN0cnVjdCBTdHJ1Y3RBe2ZpZWxkX3QgZmllbGQ7fTsKc3RydWN0IFN0cnVjdEJ7b3RoZXJfdCBvdGhlcjt9OwpzdHJ1Y3QgU3RydWN0QzpwdWJsaWMgU3RydWN0QXt9OwpzdHJ1Y3QgU3RydWN0RDpwdWJsaWMgU3RydWN0Qnt9OwpzdHJ1Y3QgU3RydWN0VHtvdGhlcl90IGZpZWxkO2ZpZWxkX3Qgb3RoZXI7fTsKLy9JbXBsZW1lbnRhdGlvbiBkZXRhaWwKdGVtcGxhdGU8dHlwZW5hbWUgVCx0eXBlbmFtZSBGSUVMRF9UPgpzdHJ1Y3QgdHlwZV9oYXNfZmllbGR7CiAgc3RydWN0IEZhbGxiYWNrIHtGSUVMRF9UIGZpZWxkO307CiAgc3RydWN0IERlcml2ZWQ6VCxGYWxsYmFja3t9OwogIHRlbXBsYXRlPHR5cGVuYW1lIEMsIEM+IHN0cnVjdCBDaFQ7CiAgdGVtcGxhdGU8dHlwZW5hbWUgQz4gc3RhdGljIGNoYXIgKCZmKENoVDxGSUVMRF9UIEZhbGxiYWNrOjoqLCAmQzo6ZmllbGQ+KikpWzFdOwogIHRlbXBsYXRlPHR5cGVuYW1lIEM+IHN0YXRpYyBjaGFyICgmZiguLi4pKVsyXTsKCiAgc3RhdGljIGJvb2wgY29uc3QgdmFsdWUgPSBzaXplb2YoZjxEZXJpdmVkPigwKSkgPT0gMjsKfTsKLy9FeHBlcmltZW50CnZvaWQgVW5pdFRlc3QoKXsKICBzdGF0aWNfYXNzZXJ0KAogICAgdHJ1ZT09dHlwZV9oYXNfZmllbGQ8U3RydWN0QSxmaWVsZF90Pjo6dmFsdWUsCiAgICAiZmllbGRfdCBTdHJ1Y3RBOjpmaWVsZCAtIHNob3VsZCBleGlzdCIKICApOwogIHN0YXRpY19hc3NlcnQoCiAgICBmYWxzZT09dHlwZV9oYXNfZmllbGQ8U3RydWN0QixmaWVsZF90Pjo6dmFsdWUsCiAgICAiZmllbGRfdCBTdHJ1Y3RCOjpmaWVsZCAtIHNob3VsZCBub3QgZXhpc3QiCiAgKTsKICBzdGF0aWNfYXNzZXJ0KAogICAgdHJ1ZT09dHlwZV9oYXNfZmllbGQ8U3RydWN0QyxmaWVsZF90Pjo6dmFsdWUsCiAgICAiZmllbGRfdCBTdHJ1Y3RDOjpmaWVsZCAtIHNob3VsZCBleGlzdCIKICApOyAgCiAgc3RhdGljX2Fzc2VydCgKICAgIGZhbHNlPT10eXBlX2hhc19maWVsZDxTdHJ1Y3RELGZpZWxkX3Q+Ojp2YWx1ZSwKICAgICJmaWVsZF90IFN0cnVjdEQ6OmZpZWxkIC0gc2hvdWxkIG5vdCBleGlzdCIKICApOwogIHN0YXRpY19hc3NlcnQoCiAgICBmYWxzZT09dHlwZV9oYXNfZmllbGQ8U3RydWN0VCxmaWVsZF90Pjo6dmFsdWUsCiAgICAiZmllbGRfdCBTdHJ1Y3RUOjpmaWVsZCAtIHNob3VsZCBub3QgZXhpc3QiCiAgKTsKICBzdGF0aWNfYXNzZXJ0KAogICAgdHJ1ZT09dHlwZV9oYXNfZmllbGQ8U3RydWN0VCxvdGhlcl90Pjo6dmFsdWUsCiAgICAib3RoZXJfdCBTdHJ1Y3RUOjpmaWVsZCAtIHNob3VsZCBleGlzdCIKICApOwp9CmludCBtYWluKCl7cmV0dXJuIDA7fQ==