2013-05-08 15 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; 
} 

メンバポインタの推論チェインが内部メンバーに到達する唯一の解決方法である場合、テンプレートを使用してこれを1つのタイプにカプセル化できますか? C++メンバーのメンバーへのポインター


は今のコードは

は皆

+0

このコードは非常に奇妙に見えると私はそれをコンパイルすることができません。 正確にはどういう意味ですか? A B :: * ba = &B::a; 本当に間違いありませんか? コードは次のように表示されています。 A a; B b; b.a = a; ポインタで同じことをしますが、 "::"と決してしません。 –

+1

@AdrianMaire: 'AB :: * ba = &B::a;'は 'ba'を' A'型の 'B'のメンバへのポインタに宣言して初期化します'&B :: a'を使用します。コンパイラはうまくいくはずです。 –

+0

@Charles Bailey:ありがとう、私はそれについてもっと学びます。 –

答えて

2

はC :: Bに到達することが可能であるありがとう:: Aをメンバーポインタでgccでコンパイルすることができますか?

の並び替え:

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

は、唯一の解決策を連鎖ポインタ推論ですか?

はい

関連する問題