tr1 の mem_fn および bind ユーティリティのクールで実用的な使い方を誰かが推奨できますか? ライブラリ開発に難解な c++ は必要ありません。これらを利用するアプリケーションレベルのコーディングです。
どんな助けでも大歓迎です。
リフレクション スタイル プロパティにstd::mem_fn
とを使用しました。std::bind
したがってclass SomeClass
、 のベクトルを持つ がありAbstractProperty
ます。AbstractProperty
、 など、PropertyFloat
からいくつかの異なるタイプのクラスが存在する可能性がありますPropertyU32
。
次に、SomeClass
私はbind
forstd::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
もちろん、型はテンプレートを利用してより一般的なものにすることもできますが、それは何のために開発するかによってトレードオフになります。
通常、コールバックにメンバー関数を使用するのは非常に面倒な場合があります。たとえば、<algorithm>
関数で使用する場合などです。std::mem_fn
(現在標準化されているため、名前空間を使用する必要はありtr1
ません)これらの関数のファンクターオブジェクトとして使用できる呼び出し可能なオブジェクトを作成します。その使用例については、を使用するこのリンクstd::string::size
の例のセクションを参照してください。
std::bind
たとえば、コンパイル時に実際の引数がわからないが、実行時に引数を使用して呼び出し可能なオブジェクトを作成する必要がある場合に使用できます。引数の並べ替えにも使用できます。例:
auto f1 = std::bind(printf, _2, _1);
f1(42, "%d\n");
(さて、ばかげた例ですが、私が今考えることができるすべてです。)
次のコードは、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;
}