假设我有一个函数int func(int x, int y, int z)
,我需要在另一个函数中调用它10次,即int runge(int, ... , int func(int a, int b))
。
我知道我可以创建10个函数,即
int runge1(int a, int b) {return func(1, a, b);}
但是,我想要一个更简单的方法。 基本上我想创建一个函数指针:
for(int i=0; i<10; i++)
{
//func would have two variables input into it, variable1, variable2
int (*func)=func(i, variable1, variable2);
}
答案 0 :(得分:4)
您正在寻找std::bind
:
std::function<int(int,int)> f = std::bind(&func, i, std::placeholders::_1, std::placeholders::_2);
这会将i
绑定到func
的第一个参数,并将其余参数保持为未绑定。然后你可以这样打电话给f
:
f(1, 2);
如果您愿意,可以将所有新绑定的功能推送到std::vector
:
using namespace std::placeholders;
std::vector<std::function<int(int,int)>> funcs;
for (int i = 0; i < 10; i++) {
funcs.push_back(std::bind(&func, i, _1, _2));
}
如果你没有C ++ 11,那么就有一个boost::bind
对应物。
答案 1 :(得分:1)
我不是100%肯定你的描述,但看起来你正在寻找咖喱功能。
在C ++中,这是一个很好的例子:How can currying be done in C++?
答案 2 :(得分:0)
我很确定你想知道std::function
,Lambdas以及std::bind
:
int func(int x, int y, int z);
typedef std::function<int(int,int)> FuncT;
std::array<FuncT, 10> functions; //or whatever container suits your needs
for (int i = 0; i < 10; ++i)
{
functions[i] = [=](int a, int b) { return func(i,a,b); }; //with lambdas
functions[i] = std::bind(func, i, std::placeholders::_1, std::placeholders::_2); //with bind
}
(我更喜欢lambdas,但这只是一种品味......)