5
//#define NOT_WORKS
#define HOW(X) 0
struct A {
};
struct B {
A a;
};
struct C {
B b;
};
int main(int argc, char **argv) {
A B::*ba = &B::a; // ba is a pointer to B::a member
B C::*cb = &C::b; // cb is a pointer to C::b member
#ifdef NOT_WORKS
{ A C::*ca = &C::b::a; } // error: Symbol a could not be resolved/error: ‘C::b’ is not a class or namespace
{ A C::*ca = cb + ba; } // error: invalid operands of types ‘B C::*’ and ‘A B::*’ to binary ‘operator+’
A C::*ca = HOW(???); // is possible to reach C::b::a by a member pointer?
#endif
C cptr;
A aptr = cptr.*cb.*ba; // is pointer inference chaining the only solution?
return 0;
}
멤버 포인터의 추론 체인이 내부 멤버에 도달하는 유일한 솔루션 인 경우 템플릿을 사용하여 단일 유형으로 캡슐화 할 수 있습니까? C++ 멤버 멤버에 대한 포인터
이제 코드는
이 모두
이 코드는 매우 이상한 모양과 나는 그것을 컴파일 할 수 없습니다입니다. 정확한 의미는 무엇입니까 A B :: * ba = &B::a; 정확합니까? 코드를 보았습니다 : A a; Bb; b.a = a; 포인터를 사용하는 것과 같은 일이지만 "::"을 사용하지 마십시오 –
@AdrianMaire :'AB :: * ba = &B::a;'는 'ba'를 'A'유형의 'B'멤버에 대한 포인터로 선언하고 초기화합니다 '& B :: a'를 사용하십시오. 그것은 컴파일러를 잘해야합니다. –
@Charles Bailey : 감사합니다. 그 사실에 대해 더 자세히 알게 될 것입니다. –