2016-09-01 20 views
1

私は純粋なC++(14)でシグナルスロット機構を実装しようとしていますが、スロットにはメンバー関数を除いて呼び出し可能な接続/切断/放射があります。私は、シグナルクラスのテンプレート引数によって決定される型のstd :: functionを使って単純な実装を使用しました。 std :: function :: targetを介して得られるstd :: functionの基礎となる関数ポインタを使用して、切断する正しい関数を見つける比較が行われます。Qtはメンバ関数ポインタをどのように識別しますか?

これは私が立ち往生しているところです:これはメンバー機能では機能しません。私はそれらをオブジェクトポインタとstd ::関数として格納しています。最初のクラスのポインタパラメータをバインドしたラムダから作成します。私はオブジェクトポインタ(と型)とメンバ関数へのポインタだけで単一のメンバ関数を切断できる方法が必要です。

私はQtがまさにこれをしていることは知っていますが、私はそれを行うためにmocによって生成されたコードに依存していることを恐れています。私はQObjectのソースコードを見てみましたが、すぐに濁ってしまいます(そして、メンバーへのポインタをvoid **として渡すようになったりします)。 Qtの動作を模倣するにはどうしたらいいですか?注:私は完全な身分証明書は必要ありません。引数tjaの接続と切断の呼び出しが同じ場合、これはうまくいくはずですが、(仮想スロットの場合)階層内の別のクラスを使用して関数を識別すると、すべてのベットがオフになる可能性があります。

メンバーへのポインタに特化したダミーのテンプレート関数を作成し、そのアドレスをIDとして使用することを考えましたが(私がここで意味するコードを記述しようとします)私は少なくとも、この標準に準拠した動作をICFオプションで破壊するMSVCを知っています...

PS:Boost.Signals(2)は、この問題を回避するために何らかのポインタを接続が保存されます。この接続は、信号から検索して削除するために簡単に使用できます。私は可能な限りユーザー側からこのキーを追跡する必要を避けたいと考えています。

答えて

-2

libsigC++:http://libsigc.sourceforge.net/

libsigcは++標準C++のための型保証されたコールバック・システムを実装します。これにより、信号を定義し、これらの信号を、グローバルか、メンバ関数のいずれかのコールバック関数に、静的か仮想かにかかわらず接続することができます。

+0

これは、接続が切断される「接続」オブジェクト(https://developer.gnome.org/libsigc++-tutorial/stable/ch02s04.html)を格納しているユーザーにも負担がかかるようです。これは、Qtが何をしているのではなく、私が心に留めていることにはあまり理想的ではありません。私はQtのようなシステムを実装して、それがその価値があるかどうかを見たいと思っています。 – rubenvb

+0

これは実際に質問に答えるものではありません。 –

関連する問題