メンバー関数ポインタがどのように機能するかについて混乱しているようです。特定のクラスに対して、特定の関数のインスタンスは1つだけです。これらは、暗黙的なパラメータを使用することで区別されますthis
。基本的に、次のマッピングがあるふりをすることができます。
struct Struct { void Function(); }
Struct a;
a.Function();
になる
struct Struct { }
void Function(Struct* this);
Struct a;
Function(&a);
したがって、多数のStruct
オブジェクトがあり、それらの小さなセットを呼び出したいFunction
場合は、保存せずに保存Function
しますStruct
。
メンバー関数へのポインターは、選択的に呼び出したい複数の関数がある場合に使用されます。したがって、クラスに2つの関数があり、どちらもパラメーターを受け取らず、voidを返す場合は、void (Struct::*)()
どちらかを指すことができます。しかし、それでも特定の機能を指し示しており、そのうちの1つしかありません。それでもパラメータを指定する必要がありthis
ます。
struct Struct {
Struct(int v) : value(v) { }
void One() { cout << "one: " << value << endl; }
void Two() { cout << "two: " << value << endl; }
int value;
};
int main()
{
std::vector<Struct> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
std::vector<void (Struct::*)()> f;
f.push_back(&Struct::One);
f.push_back(&Struct::Two);
f.push_back(&Struct::One);
for(int i = 0; i < 3; ++i)
(v[i].*f[i])();
}
最良の例ではありませんが、それは重要な意味を持ちます。メンバー関数を使用して、オブジェクトを組み合わせて組み合わせることができます。
*編集:コンテナが邪魔にならない例
Struct a(5), b(10);
void (Struct::*one)() = &Struct::One;
void (Struct::*two)() = &Struct::Two;
(a.*one)();
(b.*one)();
(a.*two)();
(b.*two)();
余分な括弧に注意してください。 a.*one()
不十分です。