我有很多遗留代码,它们使用函数指针作为double (*f)(double)
形式的参数。现在我需要从类中调用此函数,但函数定义使用成员变量。我该怎么做才能解决这个问题?例如,
void legacy_function(double (*f)(double)) { .... }
class myclass {
double a;
double b;
double c;
void mymethod(...) {
// need to call legacy_function() such that it uses a and b with one unknown
// a+b*x
}
请注意,我无法更改旧代码中的定义或声明。
我希望这是有道理的。感谢您的建议..
答案 0 :(得分:3)
没有干净的方法来解决这个问题。它在标准语言的范围内没有优雅的解决方案。
您可以做的一件事是提供一个全局或静态变量,它将作为中间回调包装函数的this
指针(见下文),并编写一个静态中间回调包装函数,它将调用该调用到非静态类方法
class myclass {
...
static myclass *myclass_this;
double callback_wrapper(double d) {
assert(myclass_this != NULL);
return myclass_this->callback(d); // calls the actual implementation
}
};
还要在myclass
class myclass {
...
double callback(double d) {
// do whatever you want with `a`, `b` etc.
return /* whatever */;
}
...
};
现在您可以初始化myclass_this
并使用mymethod
内部的中间回调包装器
...
void mymethod(...) {
myclass_this = this; // initilize the context
legacy_function(&callback_wrapper);
}
...
当然,所有这些都非常不优雅,因为它依赖于全局或静态变量,因此是不可重入的。
还有其他方法,这些方法都是非便携式和非标准的。 (阅读闭包和 delegates )。