10

tr1 の mem_fn および bind ユーティリティのクールで実用的な使い方を誰かが推奨できますか? ライブラリ開発に難解な c++ は必要ありません。これらを利用するアプリケーションレベルのコーディングです。

どんな助けでも大歓迎です。

4

4 に答える 4

7

リフレクション スタイル プロパティにstd::mem_fnとを使用しました。std::bind

したがってclass SomeClass、 のベクトルを持つ がありAbstractPropertyます。AbstractProperty、 など、PropertyFloatからいくつかの異なるタイプのクラスが存在する可能性がありますPropertyU32

次に、SomeClass私はbindforstd::functionにしAbstractPropertyます。私はすることbindによって

std::bind(std::mem_fn(&SomeClass::SomeFloatGetter), this)

セッタータイプの関数の場合、私は使用します

 std::bind(std::mem_fn(&SomeClass::SomeSetterGetter), this, std::placeholders::_1)

もちろん、関数をクラスに設定するのはもっと難しいですが、私は a を使ってstd::functionそうしています。私PropertyFloatが持っている

typedef std::function<float(void)> GetterType;

したがって、関数を介して設定します。最初std::bindに示したものをパラメーターとして渡します

typename PropertyFloat::GetterType getter

もちろん、型はテンプレートを利用してより一般的なものにすることもできますが、それは何のために開発するかによってトレードオフになります。

于 2012-04-14T20:53:55.177 に答える
5

通常、コールバックにメンバー関数を使用するのは非常に面倒な場合があります。たとえば、<algorithm>関数で使用する場合などです。std::mem_fn(現在標準化されているため、名前空間を使用する必要はありtr1ません)これらの関数のファンクターオブジェクトとして使用できる呼び出し可能なオブジェクトを作成します。その使用例については、を使用するこのリンクstd::string::sizeの例のセクションを参照してください。

std::bindたとえば、コンパイル時に実際の引数がわからないが、実行時に引数を使用して呼び出し可能なオブジェクトを作成する必要がある場合に使用できます。引数の並べ替えにも使用できます。例:

auto f1 = std::bind(printf, _2, _1);
f1(42, "%d\n");

(さて、ばかげた例ですが、私が今考えることができるすべてです。)

于 2012-04-14T20:50:30.577 に答える
4

次のコードは、5 を超える要素の数をカウントします。

#include <functional>
#include <algorithm>
#include <vector>
#include <iostream>

int main() {
  using namespace std;
  vector<int> v { 1, 5, 2, 7, 6, 7, 5 };
  cout << count_if(v.begin(), v.end(),
                   bind(greater<int>(), placeholders::_1, 5)) << endl;
}
于 2012-04-14T20:53:58.057 に答える