2013-05-08 6 views
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++ 멤버 멤버에 대한 포인터


이제 코드는

이 모두

+0

이 코드는 매우 이상한 모양과 나는 그것을 컴파일 할 수 없습니다입니다. 정확한 의미는 무엇입니까 A B :: * ba = &B::a; 정확합니까? 코드를 보았습니다 : A a; Bb; b.a = a; 포인터를 사용하는 것과 같은 일이지만 "::"을 사용하지 마십시오 –

+1

@AdrianMaire :'AB :: * ba = &B::a;'는 'ba'를 'A'유형의 'B'멤버에 대한 포인터로 선언하고 초기화합니다 '& B :: a'를 사용하십시오. 그것은 컴파일러를 잘해야합니다. –

+0

@Charles Bailey : 감사합니다. 그 사실에 대해 더 자세히 알게 될 것입니다. –

답변

2

는 C : B에 도달 할 수 있습니다 감사합니다 ::을 멤버 포인터의 gcc로 컴파일 할 수 있는가? 의

정렬 :

C c; 
A B::*ca = &B::a; // usage: c.b.*ca; 

포인터 추론이 유일한 해결책 체인입니까?