8

シグナル伝達 (イベント処理) にlibsigc++を使用する C++ コードに取り組んでいます。

私は C++ の初心者で、C# で考える傾向があります。C# で必要なものと同等のコードは次のようになります。

var names = new List<string>();
thing.Happened += (string name) => names.Add(name);
thing.DoStuff();

libsigc++ チュートリアルは、関数またはメンバーをシグナルにバインドする方法を示すのに優れていますが、実際にはクライアント内に非公開でカプセル化する必要があるような単純なメソッドに対して、新しいクラスレベルのメソッドを定義したくありません。少なくとも私の考えでは。

libsigc++ API はラムダ式をサポートしているようですが、それらの使用方法を示す例は見つかりませんでした。誰かが私を助けることができますか?私は C++ の初心者であることを忘れないでください。

4

3 に答える 3

6

ラムダは単なる関数オブジェクトです。したがって、任意の (つまり、テンプレート化された) ファンクターを使用できる場所ならどこでも、ラムダを使用できます。

ライブラリがインストールされていないため、これをテストすることはできませんが、この例を見ると、この変更は機能するはずです。

int main()
{
    AlienDetector mydetector;
    auto warn_people = []() {
            cout << "There are aliens in the carpark!" << endl;
    };

    mydetector.signal_detected.connect( sigc::slot<void>(warn_people) );

    mydetector.run();

    return 0;
}

PS

テストできなかったので、この答えに完全に自信がありませんでした。ドキュメントでスロット クラスのコンストラクターを見つけました。また、クラス テンプレートでコンストラクター テンプレートに遭遇したことがないため、型がすべて解決できるかどうか確信が持てませんでした。とにかく、そのコンストラクターと同じようなことを行う標準ライブラリのみを使用してテストを作成し、それは機能します。ここにあります

于 2011-05-13T16:17:57.990 に答える
2

C ++ 0xはラムダをサポートしており、おそらくC#で行うのと同様のことを行うことができます。どのC++コンパイラがすでにラムダをサポートしていますか?を参照してください。C++0x対応コンパイラー用。

于 2011-05-13T16:21:13.217 に答える
0

MSDN のこのサイトでautoは、ラムダ機能とC++0xでのキーワードの使用について、非常に適切にレイアウトされた包括的な外観が提供されています。非常に役立つ例がいくつかあり、以前のバージョンの C++ のラムダと関数オブジェクト間の接続も含まれています。g++ バージョン 4.4 以降を使用している場合、これらの機能を正しくコンパイルするには、-std=c++0xまたはフラグを使用する必要がある場合があることに注意してください。1std=gnu++0x

于 2011-05-13T16:19:16.510 に答える