【发布时间】:2012-04-16 11:43:42
【问题描述】:
我怀疑这是不可能的,但我想我会问。假设我有一个带有方法的类:
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);
我想要以某种方式对A 参数进行柯里化,并创建一个函数指针,它只接受int,但在特定A 实例上调用A::b 方法我已经预定义了。 A 实例对于该特定函数指针将保持不变,但可能有多个函数指针都指向相同的 A::b 方法,但使用不同的 A 实例。例如,我可以制作一个单独的包装函数:
A* someConstantA = new A;
void wrapper(int c) {
someConstantA->b(c);
}
void (*ptr3)(int) = &wrapper;
现在我可以使用ptr3,而无需知道它将调用调度到哪个特定A,但我必须定义一个特殊函数来处理它。我需要一种方法来为任意数量的 A 实例创建指针,所以我不能像那样对其进行硬编码。这有可能吗?
编辑:应该提到,我被困在 C++03 领域,也无法使用 Boost
【问题讨论】:
-
必须是函数指针吗?你想要做的通常是使用函数对象来完成(例如使用
std::bind)。 -
@KennyTM 任何可调用的作品;我不知道
std::bind,正在阅读中 -
^^^ 或
boost::bind如果你没有 C++11。 -
函数对象是定义
operator()的对象,因此您可以像函数一样使用它。在内部,它可以保存一个this指针和一个函数指针。std::bind是一种方法,或者您可以手动滚动。 -
@Ben 啊,我刚刚意识到
std::bind也在 c++11 中,所以我不能使用它(编辑了我遇到问题的环境)。我没想过要创建一个实现operator()的类;这可能是这样做的方法
标签: c++ function-pointers pointer-to-member