3

有没有办法将成员函数作为参数传递给全局函数?我发现了这个,但它并没有真正解决我的问题。

可以说我有以下全局函数:

double Function(double (*fEval)(double F1, double F2),double min, double max,int numArgs,...);

bool Function2(double (*fEval1)(double F1, double F2),double (*fEval2)(double F1, double F2),double xmin, double xmax, double ymin, double ymax,double &ax, double &ay,int numArgs,...);

我的一个成员函数将 Function2 称为

Function2(&F1, &F2, 0, m_m1, 0, m_m2, &m_n1, &m_n2,0);

其中 F1 和 F2 是成员函数,而 Function2 在某处调用 Function1 但目前我的问题是 Function2 以及如何正确声明它。

好的,现在我已经设法将我的函数声明更改为

bool Function2(double (CLASS::*)(double F1, double F2),double (CLASS::*)(double F1, double F2),double xmin, double xmax, double ymin, double ymax,double *ax, double *ay,int numArgs,...)

当我尝试调用已替换为 CLASS::* 的函数 fEval1 和 fEval2 时,我可能只有一个问题,那么如何在该函数中调用第一个和第二个成员函数?

4

2 回答 2

4

这样做是有可能的,但它是否是你真正想要做的事情存在很多问题。

有一个指向成员函数的指针,它基本上充当结构中的偏移量,因此要使用它,您需要提供指向成员函数的指针调用该成员函数的对象. 鉴于您正在做的事情,看起来不太可能(至少对我而言)您真的想要这个。

我的直接反应是将你的Function1and编写Function2为模板,并传递函子而不是指向函数的指针。而不是指定一个普通的成员函数,每个函数都将像其他仿函数一样,并重载operator()来完成工作。

编辑:如果可以的话,我也会避免使用可变参数函数——它们会丢弃类型信息,这是 C++ 中明确的禁忌之一。尤其是对于支持 C++11 的新 C++ 编译器,几乎总是很容易避免它(您可以传递一个创建对象的初始化列表)。

于 2012-05-04T16:50:37.490 回答
4

成员函数指针与普通函数指针不同——您需要将它们的类指定为类型的一部分。此外,在调用它们时,您需要指定调用成员函数的对象。

您的错误消息表明您传递的成员函数的类型实际上是double (CLASS::*)(double, double) - 这与签名中的普通函数指针类型不兼容

看看这里的 C++ FAQ 以获得更多关于如何使用成员函数指针的信息:

http://www.parashift.com/c++-faq-lite/pointers-to-members.html

于 2012-05-04T16:41:55.217 回答