您似乎对成员函数指针的工作方式感到困惑。对于给定的类,任何给定函数只有一个实例。它们通过使用隐式参数来区分this
。基本上,你可以假装你有以下映射。
struct Struct { void Function(); }
Struct a;
a.Function();
变成
struct Struct { }
void Function(Struct* this);
Struct a;
Function(&a);
因此,如果您有一堆Struct
对象,并且想要调用Function
其中的一小部分,则不要存储Function
,而是存储Struct
。
当您有多个要有选择地调用的函数时,使用指向成员函数的指针。因此,如果您的类中有两个函数,它们都没有参数并返回 void,void (Struct::*)()
则可以指向它们中的任何一个。但它仍然指向一个特定的功能,其中只有一个。您仍然需要提供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()
是不够的。