具有已知参数的函数指针

时间:2010-11-16 06:12:53

标签: c++ function-pointers

我有很多遗留代码,它们使用函数指针作为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

   }    

请注意,我无法更改旧代码中的定义或声明。

我希望这是有道理的。感谢您的建议..

1 个答案:

答案 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 )。