C++函数参数不会编译

C++ function parameters wont compile

所以我有一个原型函数

double Solution::bisect
(
    double xLeft,
    double xRight,
    double epsilon,
    double f(double x, EquCoeffs coeffsStruct),
    bool &error
);

其中函数 f 的原型是这样的

double Solution::f(double x, EquCoeffs coeffsStruct);

我在 Visual Studio 中遇到的错误是 argument of type "double(Solution::*)(double x, Solution::EquCoeffs coeffsStruct)" is incompatible with parameter of type "double(*)(double x, Solution::EquCoeffs coeffsStruct)"

当我尝试调用 bisect(xLeft, xRight, epsilon, f, error); 时发生 其中 xRight xLeft epsilondouble 类型,errorbool.

类型

为什么不能编译?我不确定我是否理解错误。 double(Solution::*)double(*) 有何不同?

函数指针使用起来可能很乏味,这就是 typedef 派上用场的地方:

typdef R (*FREE_FUNC)(ARGS);

使FREE_FUNC成为R(*)(ARGS)类型函数指针的别名,即具有ARGS参数和Rreturn类型的函数。新名称出现在 typdef 的中间可能看起来有点奇怪。然而,在其他地方使用函数指针会更好,例如

typedef void (*LOGGER)(R,ARGS);
R decorate(FREE_FUNC func,LOGGER logger,ARGS args){
    R result = func(args);
    logger(result,args);
    return result;
}

成员函数指针不同,因为你需要一个对象来调用它们:

struct Foo {
    void foo(){std::cout << "moo \n";}
    void moo(){std::cout << "xyz \n";}
};

typedef void (Foo::*FOO_MEMBER_FUNC)();

void fooCaller(Foo f,FOO_MEMBER_FUNC mf){
    (f.*mf)();
    // ... or ...
    Foo* f_ptr = &f;
    (f_ptr->*mf)();
}

int main() {
    FOO_MEMBER_FUNC foo_ptr = &Foo::foo;
    FOO_MEMBER_FUNC moo_ptr = &Foo::moo;
    Foo f;
    fooCaller(f,foo_ptr);
    fooCaller(f,moo_ptr);
}

我还应该提一下,有更好的方法来传递函数。你可以看看std::function.