11

C++/CLI では (C# のように) マネージド ラムダを作成できないため、マネージド変数をキャプチャできません。(ラムダではなく) 通常のメソッドを作成することはできますが、管理された変数をキャプチャすることはできません。

C++/CLI コードで採用する標準的な回避策はありますか? つまり、C++/CLI で使用して C# から次のことを実行できる標準パターンを探しています。

class A { }

class B
{
    void Foo()
    {
        A a = new A();
        Func<A> aFunc = () => a; // Captures a
    }
}

私はできた

  • キャプチャする変数ごとにメンバー変数を作成し、デリゲートでそのメンバー変数を使用します。これは、キャプチャされた異なる a で動作するメソッドの 2 つの呼び出しがある可能性があるため、一般的なケースでは機能しませんが、一般的なケースでは機能します。
  • ctor でキャプチャを行うネストされたクラスを作成し、このネストされたクラスのメソッドをデリゲートとして使用します。これは一般的なケースで機能するはずですが、さまざまな変数をキャプチャするたびに、ネストされたクラスが必要になることを意味します。

質問:上記のオプションよりも優れたオプションはありますか? または、上記のどのオプションが主なアプローチになりますか?

関連する質問:

4

3 に答える 3

5

C# ラムダの逆コンパイルを見ると、C# コンパイラがオプション #2 と同じことを行うことがわかります。使い捨てのクラスをたくさん作成するのは面倒ですが、それをお勧めします。

C# ラムダでは、ネストされたクラス インスタンスを作成するときに、ローカル変数の代わりにそれをどこでも使用します。ネストされたクラスを使用するメソッドを作成するときは、このことに留意してください。

于 2013-07-31T20:27:02.773 に答える