一部の C# コードを C++ に変換中です。私は最初、デリゲートを C スタイルのコールバックに置き換えることを考えていました。ただし、コードをさらに調べたところ、次のような (疑似 C# コード) ステートメントを使用して、デリゲートがマルチキャスト方式で使用されているため、これは機能しないことがわかりました。
DelegateTypeOne one = new DelegateTypeOne(someCallbackFunc1)
one += new DelegateTypeOne(someCallbackFunc2)
移植されるコードがデリゲートを単一のキャスト方式で使用する場合、通常の C スタイルの関数ポインターを使用することでうまくいく可能性があることを理解しています。その点について、1 つ質問があります。次の C++ コードは有効ですか?:
typedef std::vector<int> (CallbackTypeOne*) (const std::string& s, const bool b);
std::vector<int> foo (const std::string& s, const bool b);
CallbackTypeOne func_ptr = NULL;
func_ptr = new CallbackTypeOne(foo); // Note: new being used on a typedef not a type
// or should I just assign the func the normal way?
func_ptr = foo; // this is what I am doing at the moment
デリゲートの実装に関する私の最初のアイデアは、ファンクターとなるデリゲートと呼ばれる ABC を作成することでした。他のすべてのデリゲートはこの ABC から派生し、STL コンテナー (ほとんどの場合、リスト) を持ちます。このコンテナーには、割り当てられた関数のリストが含まれ、順番に呼び出されます。
これはかなりの作業のようであり、最適なアプローチであるとは確信していません。この種の C# から C++ への変換を以前に行った人はいますか? C++ でマルチキャスト デリゲートを実装するための推奨される方法は何ですか?