5

C ++標準ライブラリでは、ほとんどすべてのalgo関数が呼び出し可能なオブジェクトを引数として取ります。今、私は自分のプログラムでこれを試してみたいと思います。find_iforのような関数のヘッダーを開きましたが、search_n()これらの呼び出し可能なオブジェクトパラメーターがどのように処理されるか、そしてもちろん、特にラムダオブジェクトの引数がどのようにそれらに渡されるかについてはあまり理解できませんでした(ラムダbind()に使用できます、わかりません)


誰かが私にこのことがどのように機能するかを説明できますか?前もって感謝します

4

2 に答える 2

13

関数のような型のテンプレートパラメータを用意し、その型の引数を取るだけです。

template <typename Function>
void foo(Function func) {
  // Use func like so
  func(10);
}

これは、標準ライブラリアルゴリズムがそれを行う方法です。あなたは次のようにラムダでそれを呼び出すことができます:

foo([](int x) { std::cout << (x * 2) << std::endl; });

もちろん、これには、ドキュメントでタイプとして期待する関数の種類を指定する必要があります(取得するまで( ConceptsFunctionを取得するまで)。単項である必要がありますか?バイナリである必要がありますか?どのタイプの引数を取る必要がありますか?何を返す必要がありますか?

または、次を使用して特定のタイプの関数を取得することもできますstd::function

int foo(std::function<int(char)> func) {
  return func('a');
}

今回は、引数fooを取り、を返す関数のようなオブジェクトのみを取ります。ただし、このメソッドには1つの欠点があります。それは、コンパイラーが、渡したラムダをインライン化する可能性が低いことです。charintfunc

関数を引数として取る最も基本的な方法は、関数ポインターを使用することです。

int foo(int (*func)(char)) {
  return func('a');
}

ただし、これは関数ポインターのみを取ります(一部のラムダは関数ポインターに変換できます)。ファンクターやその他の種類のものは必要ありません。

于 2013-03-05T23:49:27.807 に答える
0

すべてのアルゴリズム関数は、find_ifがループでテストする述語を認識している必要があるなど、アルゴリズムをテストするためのいくつかの関数を取得する必要があります。すべてのstdlibはテンプレートで動作し、呼び出し可能なオブジェクトとして関数テストに合格できます。呼び出し可能なオブジェクトは、オーバーロードoperator()を持つオブジェクトであり、std libは、送信されたオブジェクトを何らかのパラメーターで呼び出し、必要に応じて戻り値を取得します。いくつかのサイトで必要なパラメータと戻り値を見つけることができます。特に私は常にhttp://www.cplusplus.com/を使用しており、すべてのstdlibの多くのドキュメントをリファレンスメニューで見つけることができます。

あなたからの特別な例: http: //www.cplusplus.com/reference/algorithm/find_if/ find_ifは、最初と最後の2つのイテレータと、イテレータが指すオブジェクトを取得する呼び出し可能オブジェクトを取得します。ブール値を返します。

于 2013-03-06T00:02:53.397 に答える