C ++如何将参数绑定到接受函数的函数?

时间:2019-07-03 10:06:04

标签: c++ bind

我有一个函数fx_1,它接受​​一个函数和其他参数。我想创建一个参数为f1的新函数fx_1。但是我不能使用f1

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

using namespace std;
using namespace std::placeholders;

double fun_exp(double x, double* y) {
    return exp(x) - x - 1;
};
double fx_1(function<double(double, double*)> fun,
    double x0, double* data = nullptr, int order = 4) {
    return 5.0;
};

int main() {

    auto f1 = bind(fx_1, fun_exp, _2, _3, 4);
    double* x = new double;
    *x = 6.0;
    cout << f1(3.0, x) << endl; //Compile Error

    function<double(double, double*)> f2 = bind(fx_1, fun_exp, _2, _3, 4); //Error.

    function<double(double, double*)> f3 = bind<double,
        function<double(function<double(double, double*)> fun, double, double*, int)>,
        double, double*>(fx_1, fun_exp, _2, _3, 4); //Error.

}

我认为f1应该接受double, double*类型的参数,因为fx_1的参数2和3的类型为double, double *

f2f3中,我尝试显式设置模板参数,但是它们都不起作用。

2 个答案:

答案 0 :(得分:3)

占位符编号是指绑定函数将来调用中的参数。
也就是说,bind(fx_1, fun_exp, _2, _3, 4);是一个函数(类似),具有三个参数,并且仅使用第二个和第三个参数,例如f1(0, 3.0, x)

(如果他们引用您要绑定的功能,则不需要任何编号。)

使用_1_2或lambda函数(可读性更好,效率更低)。

答案 1 :(得分:1)

bind()的占位符表示传递给创建的新函数的args,因此您的'_2,_3'应该是'_1,_2'