我怀疑这是不可能的,但我想我会问。假设我有一个带有方法的类:
class A {
public:
void b(int c);
};
我可以创建一个指向该成员函数的指针:
void (A::*ptr)(int) = &A::b;
(someAInstance.*ptr)(123);
我也可以滥用函数指针并创建一个直接接受 A
参数的指针(我不知道这是否安全,但它可以在我的机器上运行):
void (*ptr2)(A*, int) = (void (*)(A*, int))&A::b;
(*ptr2)(&someAInstance, 123);
我想要的是以某种方式柯里化(Currying)A
参数,并创建一个只接受int
但调用的函数指针我预定义的特定
方法。 A
实例上的 code>A::bA
实例对于特定的函数指针将保持不变,但可能有多个函数指针都指向相同的 A::b
方法,但使用不同的 A
实例。例如,我可以制作一个单独的包装函数:
A* someConstantA = new A;
void wrapper(int c) {
someConstantA->b(c);
}
void (*ptr3)(int) = &wrapper;
现在我可以使用 ptr3
而无需知道它将调用分派(dispatch)给哪个特定的 A
,但我必须定义一个特殊的函数来处理它。我需要一种方法来为任意数量的 A
实例创建指针,所以我不能像那样对其进行硬编码。这有可能吗?
编辑:应该提到,我被困在 C++03 领域,也无法使用 Boost
最佳答案
不要创建包装器函数,创建一个包装器 functor 。这允许您在可调用对象中封装任何您想要的状态(例如 A*
)。
class A {
public:
void b(int c) {}
};
struct wrapper {
A* pA;
void (A::*pF)(int);
void operator()(int c) { (pA->*pF)(c); }
wrapper(A* pA, void(A::*pF)(int)) : pA(pA), pF(pF) {}
};
int main () {
A a1;
A a2;
wrapper w1(&a1, &A::b);
wrapper w2(&a2, &A::b);
w1(3);
w2(7);
}
关于c++ - 动态创建一个函数指针来调用给定实例上的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9982787/