しるふぃずむ

どうもプログラマです。好きなものはC#とジンギスカンです。嫌いなものはJava。プログラムおもちろいね。

メンバ関数ポインタ周りのシンタックス

相変わらずキモい.
すぐわからなくなるのでメモしますが,実際に使う場合はまず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