3

私はC++関数を持っていると言います

int foo(int x, int y){
   return x+y ;
}

この関数の「パラメーター化された」バージョンを作成する方法はありますか?

つまり、foo()から始めて、yを特定の値に固定した関数ポインターを定義したいと思います。これは次のように関数foo2()を作成するのと同じです。

int foo2(int x){
  return foo(x,2);
}

関数ポインタがない場合、同様の動作をするための代替手段になる可能性がありますか?

4

4 に答える 4

7

を使用して関数の引数を修正(またはカレーstd::bind)できます。

たとえばfoo2

auto foo2 = std::bind(foo, std::placeholders::_1, 2);

あなたはこれを次のように読むことができます:

toのfoo2呼び出しfooは、最初の引数がfoo2呼び出しの最初の引数であり、2番目の引数が。である呼び出しのようなものです2

ラムダ関数を使用して実行できます。

auto foo2 = [] (int x) { return foo(x, 2); }

上記の動作を参照してください

最後に、C ++ 11を使用できない場合は、同等のがありboost::bindます。

于 2012-10-08T08:15:39.750 に答える
0

関数をオーバーロードできます

int foo(int x) {
    return foo(x,2);
}

そして、あなたは同じ名前を持つでしょう...またはデフォルトの引数ソリューション...

于 2012-10-08T08:18:41.057 に答える
0

関数ポインタは、この種のものをサポートしていません。実際、彼らサポートしているのは静的関数を指すことだけです。コールバックに使用しないでstd::functionください。代わりに、またはテンプレートを使用してください。

またはラムダを使用std::bindして、この目標を達成できます。ただし、関数ポインターは取得できません。適切な抽象化(テンプレートまたは)を介して使用できる関数オブジェクトのみが取得されますstd::function

于 2012-10-08T08:19:14.257 に答える
0

たとえば、std::bindを使用できます。

std::bind2nd (std::ptr_fun (foo), arg2) (arg1) // replace second argument
std::bind1st (std::ptr_fun (foo), arg1) (arg2) // replace/bind first argument

変数に割り当てることもできます。

auto fun = std::bind1st (std::ptr_fun (foo), 2);
auto fun = std::bind2nd (std::ptr_fun (foo), 2);

または、コンパイラがC++11をサポートしていない場合

typedef std::binder1st<std::pointer_to_binary_function<int, int, int>> fun_type;
fun_type fun = std::bind1st (std::ptr_fun (foo), 2); // foo (2, arg2);


typedef std::binder2nd<std::pointer_to_binary_function<int, int, int>> fun_type2;
fun_type2 fun = std::bind2nd (std::ptr_fun (foo), 2); // foo (arg1, 2);

それからそれを呼びます

fun (arg);
于 2012-10-08T08:19:35.057 に答える