次の例を見てください。
#include <iostream>
using namespace std;
class Test {
public:
int fun1(int x) { return x+1; }
};
typedef int (Test::*PtrType)(int);
void call(Test& self, PtrType prt) {
cout << (self.*ptr)(2) << endl;
}
int main() {
Test t;
call(t, &Test::fun1);
return 0;
}
この行typedef int (Test::*PtrType)(int);
は、型の単純な名前をクラス メソッドに定義します。括弧(Test::*PtrType)
は重要です。PtrType
は新しく定義された型です (typedef を使用せずに署名全体をcall
関数の引数に入れることもできますが、そのようなアプローチは強くお勧めしません)。
この式(self.*ptr)(2)
は、 pointer が指すメソッドを呼び出し、ptr
引数として 2 を渡します。ここでも重要な点は、括弧を付けること(self.*ptr)
です。
覚えておくべき最後のポイントは、通常の関数で可能であっても&
、ポインター ( ) の値を設定するときにスキップできないことです。&Test::fun1
テンプレートを使用すると、コードを少しきれいにすることができます。
template <typename PtrT>
void call(Test& self, PtrT ptr) {
cout << (self.*ptr)(2) << endl;
}
このような場合、typedef は必要ありませんが、呼び出しの括弧について覚えておく必要があります。
新しい C++0x 標準でコンパイルする場合は、std::function
またはを使用できますstd::bind
。