• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:->*演算子のオーバーロードについて)

->*演算子のオーバーロードについて

このQ&Aのポイント
  • C++の->*演算子のオーバーロード方法について質問です。AllowOverLoadクラスに->*演算子をオーバーロードする必要がありますが、具体的な方法がわかりません。
  • AllowOverLoadクラスに->*演算子をオーバーロードしなければならない状況ですが、具体的な方法がわかりません。
  • C++のAllowOverLoadクラスに->*演算子をオーバーロードする方法について質問です。具体的な方法がわかりません。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

確かに自分も悩んだ. 結局規格を読んで解決したんだけど. operator->* は 2項演算子で, a->*b は a.operator ->*(b) と解釈されます. 今の例では overload->*lpTestFunc が overload.operator ->*(lpTestFunc) と解釈されるので, クラス AllowOverLoad に operator ->*(void (Test::*func)()) を定義する必要があります. また, この演算子の返り値も注意する必要があります. 返した値を直接関数呼び出しとして使うためには ・「普通の」関数 (へのポインタ) を返す ・operator () がオーバロードされたクラスのオブジェクトを返す のどちらかが必要になります. ところが, static でないメンバ関数への . 等を使った参照は「ただちに関数呼び出しを行う」ことしかできません. 従って, operator ->*(void (Test::*func)()) では「operator () をオーバロードしたオブジェクトを返す」という作業をしなければなりません. 全体として, 例えば #include <iostream> class Test { public: void testFunc() { std::cout << "TestFunc" << std::endl; } }; class Funcall { public: Funcall(Test *ptr, void (Test::*func)()) : ptr_(ptr), func_(func) { } void operator ()() const { return (ptr_->*func_)(); } private: Test *ptr_; void (Test::*func_)(); }; class AllowOverload { public: Funcall operator ->*(void (Test::*func)()) { return Funcall(new Test, func); } }; int main() { void (Test::*lpTestFunc)() = &Test::testFunc; AllowOverload ovl; (ovl->*lpTestFunc)(); return 0; } とすることで所与の目的を果たすことができます. とはいえ, 本当にオーバロードが必要なんでしょうか?

0xEF
質問者

お礼

とても丁寧な回答ありがとうございます。 なるほど・・・何度か読み返してやっと理解することができました。 自分が予想していたよりもはるかに複雑でむずかしかったです。 実は自作のスマートポインターとメンバ関数ポインタを併用しようとしたら、今回の問題に当たりました。 またもう少し、考察してみます。 ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.2

こんなサンプルを見つけましたよ。 http://www.google.com/codesearch/p?hl=ja&sa=N&cd=10&ct=rc#k8ASkoRpGpg/Zdroj%C3%A1ky_Volume_1/C12/PointerToMemberOperator.cpp&q=%22operator-%3E*%22%20lang:c%2B%2B

すると、全ての回答が全文表示されます。

関連するQ&A