私は主に C++ プロジェクトに取り組んでいる .NET プログラマであり、Action および Function テンプレート型を使用するデリゲートを処理する同等の方法を決定しようとしています。デリゲートを .NET コード内のイベントとコールバックの両方として使用します。私の C++ プロジェクトでは、スマート ポインターと、C# プログラムと同じデリゲート デザイン パターンを使用しています。この状況を処理する最善の方法は何ですか? イベント コンテナーが弱い参照を使用するため、スマート ポインターと潜在的な基になるオブジェクトの削除も追跡する関数ポインターを渡し、維持する方法が明確ではありません。ライブラリはマルチプラットフォームである必要があるため、残念ながら CLR を使用することはできません。
2 に答える
あなたが探しているのは、既存のオブジェクトにバインドされたメソッド ポインターです。
boost::bindを探す必要があります。環境がサポートしている場合は、C++11 をサポートしている場合std::tr1::bind
でも、 またはを使用できます。std::bind
必要なものを示す例は次のとおりです。
struct X
{
bool f(int a);
};
X x;
shared_ptr<X> p(new X);
int i = 5;
bind(&X::f, ref(x), _1)(i); // x.f(i)
bind(&X::f, &x, _1)(i); //(&x)->f(i)
bind(&X::f, x, _1)(i); // (internal copy of x).f(i)
bind(&X::f, p, _1)(i); // (internal copy of p)->f(i)
最後の 2 つの例は、「自己完結型」の関数オブジェクトを生成するという点で興味深いものです。bind(&X::f, x, _1) は x のコピーを格納します。bind(&X::f, p, _1) は p のコピーを格納し、p は boost::shared_ptr であるため、関数オブジェクトは X のインスタンスへの参照を保持し、p がスコープ外またはスコープ外になった場合でも有効なままになります。リセット()です。
との違いについては、boost::bind
SOに関するこの他の質問をご覧ください。std::tr1::bind
std::bind
見てみましょう: http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible
また、C++ のデリゲートがややこしい理由についても説明します。このライブラリは、私が読んだゲーム開発の本で推奨されていました (したがって、非常に高速であると想定しています)。