来自std :: bind的转换函数

时间:2015-04-25 15:32:27

标签: c++

当我使用std::bind从另一个创建新函数并尝试将其传递给另一个函数时,我收到错误。

我的代码看起来像

#include <functional>
using namespace std;
typedef double (*t_function)(double t, double *y);

double integrate_fmax(double s, bool(*t_max)(double t, double *y), void(*fce_min)(double s, double &t_0, double *y_0), t_function fce_max, double err, t_function *f_diff, int dim){...}

void get_x1_x2(double &x1, double &x2, double(*fce)(double x), double mlt){...}

double shoot_meth(double s1, double mlt, bool(*t_max)(double t, double *y), void(*fce_min)(double s, double &t_0, double *y_0), t_function fce_max, double err, t_function *f_diff, int dim){
    double s2;  
    auto fce_x = bind(integrate_fmax, placeholders::_1, t_max, fce_min, fce_max, err, f_diff, dim);
    get_x1_x2(s1, s2, fce_x, mlt);
}

当我尝试将函数fce_x传递给get_x1_x2时,我收到错误:

C2664: 'void get_x1_x2(double &,double &,double (__cdecl *)(double),double)' : cannot convert argument 3 from 'std::_Bind<true,double,double (__cdecl *const )(double,bool (__cdecl *)(double,double *),void (__cdecl *)(double,double &,double *),t_function,double,t_function *,int),std::_Ph<1> &,bool (__cdecl *&)(double,double *),void (__cdecl *&)(double,double &,double *),double (__cdecl *&)(double,double *),double &,t_function *&,int &>' to 'double (__cdecl *)(double)'

但是当我尝试像double foo = fce_x(5)这样的东西时,我没有得到任何错误。

我使用的是Microsoft Visual Studio 2013。

P.S。对于丑陋的功能很抱歉,但我不确定错误在哪里,简化会有所帮助。

1 个答案:

答案 0 :(得分:3)

std::bind不返回函数指针。您需要使用std::function代替。这是因为std::bind只能保证返回可以存储在std::function中的内容。如果你替换

double(*fce)(double x)

std::function<double(double)> fce

它应该正常工作。