c++ - 动态创建一个函数指针来调用给定实例上的方法

标签 c++ function-pointers pointer-to-member

我怀疑这是不可能的,但我想我会问。假设我有一个带有方法的类:

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::b 方法。 A 实例对于特定的函数指针将保持不变,但可能有多个函数指针都指向相同的 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/

相关文章:

c++ - libusb_open 在 Windows 10 上返回 LIBUSB_ERROR_NOT_SUPPORTED

c++ - 关于带 switch 的 do-while 语句

c++ - 无法转换函数指针参数

c++ - 将对象方法传递给变量

c++ - 指向(数据)成员的指针作为非类型模板参数,例如具有自动存储持续时间/无链接

c++ - 如何创建一个返回成员函数指针的成员函数?

c++ - 字符串文字 C++?

c++ - 更改 Mac OS X 10.9.1 w/Xcode 5 上 R Shiny 使用的 C++ 标准库(__cxa_guard_acquire 检测到死锁)

iphone - NSComparisonResult 和 NSComparator - 它们是什么?

c++ - 使用 &MyClass::MyFunction 时出现 undefined reference 链接错误