2012年1月12日木曜日

.*演算子 メンバポインタ?

http://d.hatena.ne.jp/redboltz/20120111/1326292284
をあきらさんがつぶやいているのを見て、だいぶわからなかったので調べてみました。
http://www.geocities.jp/ky_webid/cpp/language/034.html
にメンバ関数ポインタ.*演算子について書いてありました。

とにかく
struct A{ int value_; }
に対して
A a;
a.*&A::value_ = 20;
とアクセスできることがわかりました。
まあ、なんでも
a.* がメンバにアクセスする方法で
&A::value_ がクラスの先頭からのオフセット値なんだそうでした。
まだ、途中ですが、ものすごく気持ち悪かったのが
template <class MemPtr, MemPtr p>
MemPtr Access() { return p; }
a.*Access<int A::*, &A::value_>() = 40;
で、aのメンバではないものを呼び出しているようにしか見えませんでしたが
@hudepen先生に聞いたりいろいろしていたらなんとなくわかったのですが、

a.*(Access<int A::*, &A::value_>()) = 40;
っつーことらしく、
先に計算されてAccess<int A::*, &A::value_>()が&A::value_を返すので
a.*(&A::value_ ) = 40;
となるわけで問題ないですね。
よって
void A::set(int _value){ value_ = _value;}
を呼び出す際は
(a.*Access<int A::*, &A::value_>())(50);
です。
また、A内から呼ぶ際は
void A::call(){ (this->*&A::set)(50);}
とか
void A::call(){ (this->*Access<int A::*, &A::value_>())(50) ;}
となりますでしょうか。
ほんで、当のprivateに外部からアクセスする部分はまだ見てません。

0 件のコメント:

コメントを投稿