1

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

3 回答 3

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);

如果您愿意,您可以将所有新绑定的函数推送到 a 中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对应的。

于 2013-03-12T14:06:24.763 回答
1

根据您的描述,我不能 100% 确定,但看起来您正在寻找 curry 函数。

在 C++ 中,这是一个很好的例子:如何在 C++ 中进行柯里化?

于 2013-03-12T14:06:05.840 回答
0

我很确定您想知道std::functionLambdas,也许还有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,但这是一个口味问题......)

于 2013-03-12T14:12:05.643 回答