メンバ関数ポインタ周りのシンタックス
相変わらずキモい.
すぐわからなくなるのでメモしますが,実際に使う場合はまずtypedefしたほうがよさそうです.
Ideone.com - zyUMn - Online C++ Compiler & Debugging Tool
#include <iostream> using namespace std; namespace hoge { struct Bar { int x; }; struct Foo { void Hoge(Bar bar) { cout << "Hoge " << bar.x << endl; } /** * intを引数にとり * "Barを引数にとり返り値がvoidであるFooのメンバ関数"へのポインタを返す * 静的メンバ関数 Func */ static void(Foo::*Func(int val))(Bar); }; void(Foo::*Foo::Func(int val))(Bar) { cout << "Func " << val << endl; return &Foo::Hoge; } } int main() { // 静的メンバ関数でメンバ関数ポインタを取得してptr1を初期化 void(hoge::Foo::*ptr1)(hoge::Bar) = hoge::Foo::Func(0); // メンバ関数ポインタ型 void(Foo::*)(Bar) をtypedef -> member_func typedef void(hoge::Foo::*member_func)(hoge::Bar); // 結果は同じ member_func ptr2 = hoge::Foo::Func(1); hoge::Foo foo; hoge::Bar bar1 = { 2 }; hoge::Bar bar2 = { 3 }; (foo.*ptr1)(bar1); (foo.*ptr2)(bar2); }
出力
Func 0 Func 1 Hoge 2 Hoge 3