7

gtk++でgoocanvasと連携してラムダ式を使いたいです。私の理解では、これは、ラムダを sigc++ ファンクターに入れることができなければならないことを意味します。

私はそのようなことを試しました:

sigc::slot<bool,  const Glib::RefPtr<Goocanvas::Item>& , GdkEventMotion* > slot2=
    [](  const Glib::RefPtr<Goocanvas::Item>& item, GdkEventMotion* ev)->bool
    {
        cout << "Lambda " << endl; return false;
    };

((Glib::RefPtr<Goocanvas::Item>&)item1)->signal_motion_notify_event().connect( slot2);

しかし、これはコンパイルされません。

sigc ++中間体なしでラムダまたはより良いgtkmmでsigcを直接動作させる機会はありますか:-)

4

3 に答える 3

6

引数のない void を返す関数/メソッドの場合、非常に単純です (gcc 4.6、4.7):

 fileButton.signal_pressed().connect([this]{on_file_button_clicked();});

残念ながら、コンパイルする値を返すメソッドまたは引数を取得するメソッドを取得できずsigc::mem_fun()、それらに頼る必要があります。これを修正するための最近のアクティビティがあるようです。たとえば、この commitです。sigc++ バージョン 2.2.11 以降を使用している場合は、 の定義を試すことができますがSIGC_FUNCTORS_DEDUCE_RESULT_TYPE_WITH_DECLTYPE、これがどの程度うまく機能するかはわかりません。

このバグレポートも関連しています。

于 2012-12-11T03:32:32.943 に答える
3

仕事をする次のコードが切り取られていることがわかりました。これが sigc++ ライブラリとどのように相互作用するかはわかりませんが、単純なケースには使用できます。たぶん、他の誰かがそれを見ることができます。

            #include <type_traits>
            #include <sigc++/sigc++.h>
            namespace sigc
            {   
                template <typename Functor>
                    struct functor_trait<Functor, false>
                    {   
                        typedef decltype (::sigc::mem_fun (std::declval<Functor&> (), 
                                    &Functor::operator())) _intermediate;

                        typedef typename _intermediate::result_type result_type;
                        typedef Functor functor_type;
                    };  
            }   

更新: Libsigc は、追加のユーザー コードなしでランバを処理できるようになりました。現在のバージョンが使用されている場合は、上記のコードを削除する必要があります。

于 2012-12-11T07:34:52.033 に答える