假设我们有以下课程A
:
class A
{
public:
void sum(int x);
};
我们有一个函数f
,它使用一个int
类型的参数获得一个C风格的回调并调用它:
typedef void (*Callback)(int);
void f(Callback cb)
{
cb(5);
}
在C ++中是否有办法在类型为A::print
的对象上讨论方法A
并将其传递给函数f
?像这样:
void main()
{
A a;
auto curry_a = ??; // something like curry_a = [&](int x) { a.sum(x) };
f(curry_a);
}
std::bind
和lambda-function不是解决方案,因为它们会创建std::function<>
类型的对象并重载operator()
。它看起来像在C ++中使用currying,但它不能在我的情况下使用。我需要一个真正的函数指针,即实时生成代码。
答案 0 :(得分:2)
你运气不好,不能以令人满意的方式完成:唯一恰恰是C兼容函数指针的是函数(或类函数,但不是实例函数)。
因此,您必须创建一个修复参数的函数,例如成员函数的this
。设置此参数的唯一方法是通过全局变量:
A *instance;
void (A::*a_fun)(int);
void applicator(int arg) { instance->*a_fun(arg); }
//...
int main() {
A a;
instance = &a;
a_fun = &A::sum;
f(applicator);
// ...
这是通过全局变量为普通函数提供上下文的唯一方法。