如何从更大的功能创建更小的功能?

时间:2013-03-12 14:01:55

标签: c++ function pointers

假设我有一个函数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);
    }

3 个答案:

答案 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,但这只是一种品味......)