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

必要に応じて、新しくバインドされたすべての関数を次のようにプッシュできます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%確信が持てませんが、関数をカレーしようとしているようです。

C++ での良い例を次に示します。C++ でカリー化を行う方法は?

于 2013-03-12T14:06:05.840 に答える
0

私はあなたが知りたいと確信していますstd::function、ラムダ、そしておそらく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
}

(私はラムダを好みますが、それは好みの問題です...)

于 2013-03-12T14:12:05.643 に答える