1

これは以前にも尋ねられたと思いますが、検索するのが難しいだけです...だから、私が持っているのは関数ポインタを受け入れる関数です。この関数ポインタには、たとえば 3 つの引数があります。したがって、同じポインターを別の関数に渡したいのですが、2 つの引数が入力されています。

したがって、次のようなものです。

int func1 (int (*funcptr)(int, int, int)) {
  return func2(funcptr(,8,9));
}

int func2 (int (*funcptr)(int)) {
  return (*funcptr)(2);
}

編集:わかりましたので、ラムダを使用してこれを取得しました

int func2(int (*funcptr2)(int)) {
  return (*funcptr2)(2);
}
int func1(int (*funcptr1)(int, int, int)) {
  return func2(
    [funcptr1](int i)->int {
      return (*funcptr1)(i,8,9);
    }
  );
}

しかし、それは私に与えています

"引数 1 を にfunc1(int (*)(int, int, int))::<lambda(int)>変換できません"int (*)(int)int func2(int (*)(int))

4

3 に答える 3

2

これはラムダと呼ばれ、新しいC ++バージョン、std :: bind、boost :: bind、またはboost::functionで実行できます。

于 2012-05-28T19:27:57.370 に答える
1

Cではできません。関数ポインタと2つの引数を渡す必要があります。

C ++では、これを実現するためにstd::bind(またはboost::bind古いバージョンで)使用できます。

于 2012-05-28T19:27:24.757 に答える
1

更新された質問に答えるために、変数をキャプチャするラムダ (ラムダが で行うようにfuncptr1) は関数ポインターに変換できません。ラムダはこのキャプチャされた変数をラムダごとに保存する必要があるため、直感的にこれは理にかなっています。一方、関数ポインターでそれを行う方法はありません。

最善の解決策は、おそらく type の引数を取ることですstd::function。これは、呼び出し可能な型のラッパーです。

int func2(std::function<int(int)> funcptr2) {
  return funcptr2(2);
}
int func1(std::function<int(int,int,int)> funcptr1) {
  return func2(
    [funcptr1](int i)->int {
      return funcptr1(i,8,9);
    }
  );
}

テンプレートを使用して、関数を任意の呼び出し可能な型で機能させることもできます。

template <typename F>
int func2(F funcptr2) {
  return funcptr2(2);
}
template <typename F>
int func1(F funcptr1) {
  return func2(
    [funcptr1](int i)->int {
      return funcptr1(i,8,9);
    }
  );
}
于 2012-05-29T18:37:26.537 に答える