dポイントプレゼントキャンペーン実施中!

こんにちは。質問させてください。

現在下記のような処理(main関数でやっているような処理)を実現させたいのですが、うまくコンパイルできません。

#include <iostream>

class Test
{
public:
  void TestFunc()
  {
    std::cout << "TestFunc" << std::endl;
  }
};

class AllowOverLoad
{
public:
  Test* operator ->()
  {
    return new Test;
  }
};

int main()
{
  void ( Test::*lpTestFunc )() = &Test::TestFunc;

  AllowOverLoad overload;
  ( overload->*lpTestFunc )();
}

主なエラーは
error C2296: '->*' : 無効です。左オペランドには型 'AllowOverLoad' が指定されています。
です。

おそらくこの問題を解決するにはAllowOverLoadに->*演算子をオーバーロードしなくてはいけないと思うのですが、->*演算子のオーバーロード方法がいまいちよくわかりません。
いい文献やHPも見つけられなかったので質問させていただきました。

/*
現在、本番のコーディングでは暗黙的なキャストを禁止しているのでAllowOverLoadクラスに暗黙的にTest*型にキャストするような処理はなしの方向で、あくまで->*演算子のオーバーロードということでお願いします。

Microsoft WindowsXP Professional Edition
VisualStudio 2008 AcademicEdition
*/

よろしくお願いします。

A 回答 (2件)

確かに自分も悩んだ. 結局規格を読んで解決したんだけど.


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;
}
とすることで所与の目的を果たすことができます.
とはいえ, 本当にオーバロードが必要なんでしょうか?
    • good
    • 0
この回答へのお礼

とても丁寧な回答ありがとうございます。

なるほど・・・何度か読み返してやっと理解することができました。
自分が予想していたよりもはるかに複雑でむずかしかったです。

実は自作のスマートポインターとメンバ関数ポインタを併用しようとしたら、今回の問題に当たりました。

またもう少し、考察してみます。
ありがとうございました。

お礼日時:2009/10/22 15:12

こんなサンプルを見つけましたよ。


http://www.google.com/codesearch/p?hl=ja&sa=N&cd …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!