我有一个函数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 *
。
在f2
和f3
中,我尝试显式设置模板参数,但是它们都不起作用。
答案 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'