一个类应该使用函数指针调用另一个类的方法(one class should invoke metho

2019-10-19 07:34发布

我有咨询(免责声明):

  • 类的成员函数指针
  • 调用C ++通过一个函数指针类方法
  • C ++:函数指针另一类功能

为了说明我的问题,我将使用这个代码(修订版)

#include <iostream>
#include <cmath>
#include <functional>


class Solver{
public:
    int Optimize(const std::function<double(double,double>& function_to_optimize),double start_val, double &opt_val){
        opt_val = function_to_optimize(start_val);
        return 0;
    }
};

class FunctionExample{
public:
    double Value(double x,double y)
    {
        return x+y;
    }
};

int main(){

    FunctionExample F =FunctionExample();
    Solver MySolver=Solver();

    double global_opt=0.0;

    MySolver.Optimize(std::bind(&FunctionExample::Value, &F, std::placeholders::_2),1,global_opt);

    return 0;
}

有没有一种方法来调用方法“值”? 我没有问题调用一个函数(无级)

typedef double (*FunctionValuePtr)(double x);

但是,这并不能帮助我上面的例子。 我需要显式方法名。 大多数示例使用静态方法。 我不能用静态方法。

Answer 1:

可以使用<functional>的STL的报头:

double Gradient(const std::function<double(double)>& func, double y)
{
    const double h = 1e-5;
    return (func(y+h) - func(y)) / h;
}

std::cout << D.Gradient(std::bind(&Root::Value, &R, std::placeholders::_1), 8) << std::endl;

另外像约阿希姆Pileborg评论你在主声明函数,所以你需要删除()

编辑:

为了让绑定一个固定的参数,你可以做到以下几点:

int Optimize(const std::function<double(double)>& function_to_optimize, double &opt_val){
    opt_val = function_to_optimize(opt_val);
    return 0;
}

MySolver.Optimize(std::bind(&FunctionExample::Value, &F, std::placeholders::_1, 1), global_opt);

这将调用F.Value(opt_val, 1) 您也可以与固定参数交换占位符。



文章来源: one class should invoke method of another class using a function pointer