[解決済み] std::function と std::bind: これらは何ですか、そしていつ使うべきですか?
質問
ファンクタとは何か、どのような場合に使うかは知っています。
std
の中でStroustrupが言っていることを理解していない。
C++11のFAQ
.
を説明できる人はいますか?
std::bind
と
std::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
(を使用しています)。
<=
演算子ではなく
<
もし一貫性がないのであれば、これが必要かもしれませんし、このクラスの作者のもとを訪ねてみる必要があるかもしれません)。関数型プログラミングを使用している場合は、このような変換が必要になることが多いのですが。
関連
-
[解決済み】構造体のベクター初期化について
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] C++のファンクターとその使い方とは?
-
[解決済み] std::move()とは何ですか?また、どのような場合に使用するのですか?
-
[解決済み] noexceptを本当に使うべきはいつですか?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み] 配列のベクトルを扱う正しい方法