質問: GCCを使用してプログラミングをしています。C++のメンバ関数をメモリに保存し、呼び出す方法を試しています。リンク先に記載させていただいたサンプコードとコンパイル手順にて調査を行っておりますが、エラーを回避することができていない状況です。 URLの紹介だけではなく、先にあげたサンプルコードでの具体的な実装方法をご助言いただけますとうれしいです。 [環境] Windows Vista MinGW-5.1.6
回答: こんな方法でいいのでしょうか? 1.正しい型の変数を用意する。 エラーの通り、関数ポインタの型が違います。 スタティックではないメンバ関数は、インスタンス無しでは呼び出すことはできませんので、型が違いますし、呼び出し方も違います。 参考 ``` // 引数なしのmyclassのメンバ関数に対する関数ポインタを定義 void (myclass::*func)() = 0; int main() { myclass c; // 関数ポインタにmyclass::fooをセット func = &myclass::foo; // インスタンスcに対して、funcにセットしたメンバ関数を呼び出す。 (c.*func)(); } ``` 2.boostを使う 1の方法は正しいですが、引数なしで戻り値がない関数なのに、型を変えて統一的に扱うことが難しいです。そんなときは可能であれば、boostの導入を検討してみてください。ただし、以下の例では、funcはグローバルに定義していますが、オブジェクトcの生存しているうちに呼び出さないと、セグメンテーションエラーを起こしますので、注意してください。その際は、shared_ptrなどを併用してください。 ``` #include #include // 引数なしの戻り値がvoidのファクタfuncを定義 boost::function0 func; int main() { myclass c; // インスタンスcに対するfooの呼び出しを行うファクタをfuncにセット func = boost::bind(&myclass::foo, &c); // ファンクタの実行 func(); } ``` 3.foo自体をstaticにしてしまう 1と2は元のmyclassの定義に影響を与えないという前提で対処していますが、myclassに変更を加えてもよいのであれば、fooをstaticにしてしまうという方法もあります。ただし、この方法では、valueにアクセスできません。 ``` class myclass { public: myclass() {} // 関数fooをstaticとして定義 static void foo() { printf("myclass::foo"); } }; // 引数なし戻り値voidの関数ポインタfuncを定義 void (*func)() = 0; int main() { // myclassのfooをfuncにセット func = &myclass::foo; // funcにセットした関数を呼び出し (*func)(); } ``` 何かの参考になれば。