4

しばらく前に、bind (A と呼ぶ) によって返された callable を、from A の関数へのポインターであるパラメーターを期待する別の関数 (B と呼ぶ) に渡す方法の問題に遭遇しました。 bind によって返される呼び出し可能な A は非常に複雑な型を持っているため、私のアプローチをあきらめました。

次に、機能ヘッダーの「機能」について学びました。これは、問題を解決するかのように聞こえました。しかし、何度か試みた後、私は再び挫折しました!おそらくあなたは助けることができますか?動作しないコードを次に示します。

#include <iostream>
#include <functional>  //Library for "bind" and "function"                                                                                                                                     
#include <cmath>
using namespace std;
using namespace std::placeholders;  //for _1, _2, _3 ...                                                                                                                                       

//praboloid function                                                                                                                                                                           
int parab(int x, int y)  {
  return pow(x,2) + pow(y,2);
}

//Take an integer and a pointer to a function                                                                                                                                                  
int funk(int a, int (*f)(int) )  {
  return (*f)(a);
}

int main()  {
  auto f = bind(parab, _1, 0); // Bind the second value to 0                                                                                                                                  
  function<int (int)> fp = f;

  //Any of the following lines creates and error                                                                                                                                               

  function<int (*)(int)> fp = f; //Error!                                                                                                                                                      
  funk(-5, f);  //Error!                                                                                                                                                                       
  funk(-5, &f); //Error!                                                                                                                                                                       
  funk(-5, fp); //Error!
  funk(-5 &fp); //Error!                                                                                                                                                                   

  return 0;
}

私がやりたいことは、最初にバインドを使用して新しい呼び出し可能オブジェクトを作成し、そのバインドされた関数をパラメーターとして別の関数に送信することだけです。可能であれば、バインドによって返される面倒な型を処理する必要はありません。

この問題を解決するための別のアプローチを受け入れます。

4

3 に答える 3

4

試すauto f = [](int n) -> int { return parab(n, 0); };

それはうまくいくはずfunk(-5, f)です(非キャプチャクロージャは関数ポインタに変換できるため)。

bind場所はありfunctionますが、常に最良の選択であるとは限りません。

于 2013-07-03T22:26:03.027 に答える
2

std::functionを取り、intを返すa の型intstd::function<int(int)>notstd::function<int(*)(int)>です。

次に、astd::functionを関数ポインターに変換することはできません。s を渡す場合はインターフェイスをfunkto に変更するか、未知の型の引数にします。int funk(int a, std::function<int(int)>)std::functiontemplate

第 3 に、ステートレス ラムダを使用する場合は、関数ポインターを受け取る関数に渡すことができます。ステートレス ラムダは、何もキャプチャしないラムダ型です。つまり[]、角括弧内に何もありません。この場合、バインディングはコンパイル時に既知の値であるため、バインド式をステートレス ラムダとして書き換えることができます。

于 2013-07-03T22:45:22.163 に答える
2

fありませんint (*f)(int)。不特定型の関手です。でも機能としては使えます。任意の TPE を入力するだけですfunk

template<typename F>
int funk(int a, F f)  {
  return f(a);
}
于 2013-07-03T22:51:30.770 に答える