1. ホーム
  2. c++

[解決済み] std::function と std::bind: これらは何ですか、そしていつ使うべきですか?

2022-04-25 02:35:10

質問

ファンクタとは何か、どのような場合に使うかは知っています。 std の中でStroustrupが言っていることを理解していない。 C++11のFAQ .

を説明できる人はいますか? std::bindstd::function また、初心者のために、どのような場合に使用するのか、例を挙げてください。

どのように解決するのですか?

std::bind 部分関数アプリケーション .

つまり、関数オブジェクトがあるとします f で、3つの引数を取ります。

f(a,b,c);

あなたは、2つの引数だけを取る新しい関数オブジェクトが欲しい、として定義されています。

g(a,b) := f(a, 4, b);

g は関数の部分的なアプリケーションです。 f 中間の引数はすでに指定されており、残りは2つです。

を使用することができます。 std::bind を取得するために g :

auto g = bind(f, _1, 4, _2);

これは、実際にファンクタークラスを書いてそれを行うよりも簡潔な方法です。

リンク先の記事にはさらに詳しい例が載っています。一般的には、何らかのアルゴリズムにファンクタを渡す必要があるときに使います。関数やファンクタが ほとんど が、アルゴリズムが使用するよりも多くのパラメータを設定することができます。そこで、パラメータのいくつかに引数を与えて、残りはアルゴリズムが埋められるようにする。

// raise every value in vec to the power of 7
std::transform(vec.begin(), vec.end(), some_output, std::bind(std::pow, _1, 7));

ここです。 pow は2つのパラメータを取り、以下のように上げることができます。 任意の の累乗であるが、ここでは7の累乗に注目する。

部分的な関数適用ではない、たまにの使い方として。 bind は、関数の引数を並べ替えることもできます。

auto memcpy_with_the_parameters_in_the_right_flipping_order = bind(memcpy, _2, _1, _3);

APIが気に入らないからと言って使うのはお勧めしませんが、例えば以下のような実用的な使い方が考えられます。

not2(bind(less<T>, _2, _1));

は小なり、大なり関数です(総順序を仮定しています、ばばばば)。が既に存在するので、この例は通常必要ありません。 std::less_equal (を使用しています)。 <= 演算子ではなく < もし一貫性がないのであれば、これが必要かもしれませんし、このクラスの作者のもとを訪ねてみる必要があるかもしれません)。関数型プログラミングを使用している場合は、このような変換が必要になることが多いのですが。