2011-12-09 16 views
0

私はQtに精通しています。私たちはMOCの部分がないので、同様のシンタクスを持つことはできません。しかし、私はシグナルの作成とそのクラス内でのシグナルの宣言とそれへの接続を簡単にするためにシグナル生成管理をしようとしています。私は "解決できると思います(大文字=欠けている部分)ユーザクラスのマルチシグネチャ信号管理

 


    class SignalManager 
    { 
     public: 
      typedef boost::unrodered_map<std::string, GENERIC_SIGNAL *> MapSignal; 
     public: 
      template <typename Sig> 
      bool connect(const std::string& strSignalName, boost::signal<Sig>::slot_type slot) 
      { 
      // simplyfied... : 
      (*m_mapSignal.find(strSignalName))->connect(slot); 
      } 

      template <typename Sig> 
      bool disconnect(const std::string& strSignalName, boost::signal<Sig>::slot_type slot) 
      { 
      // simplyfied... : 
      (*m_mapSignal.find(strSignalName))->disconnect(slot); 
      } 

     protected: 
      bool call(const std::string& strSignalName, SIGNAL_ARGS) 
      { 
      (*m_mapSignal.find(strSignalName))(SIGNAL_ARGS); 
      } 

      template <typename Sig> 
      void delareSignal(const std::string& strSignalName) 
      { 
      m_mapSignals.insert(MapSignal::value_type(strSignalName, new boost::signal<Sig>())); 
      } 

      void destroySignal(const std::string& strSignalName) 
      { 
      // simplyfied... : 
      auto it = m_mapSignal.find(strSignalName); 
      delete *it; 
      m_mapSignal.erase(it); 
      } 

     private: 
      MapSignal m_mapSignals; 
    }; 

    class Foo : public SignalManager 
    { 
     public: 
      Foo(void) 
      { 
      this->declareSignal<void(int)>("Move"); 
      this->declareSignal<void(double)>("Rotate"); 
      } 
    }; 


    class Other : public boost::signals::trackable 
    { 
     public: 
      Other(Foo *p) 
      { 
      p->connect("Move", &Other::onMove); 
      p->connect("Rotate", &Other::onRotate); 
      } 

      void onMove(int i) 
      { 
      /* ... */ 
      } 

      void onRotate(double d) 
      { 
      /* ... */ 
      } 
    }; 

 

この

は私が今


    class Foo 
    { 
     public: 
      void connectMove(boost::signal<void(int)>::slot_type slot) 
      void connectRotate(boost::signal<void(double)>::slot_type slot) 

     private: 
      boost::signal<void(int)> m_signalMove; 
      boost::signal<void(double)> m_signalRotate; 
    }; 

をやっているschematiclyであり、これは私がやりたいものをbasicalyですboost :: functions_traits <>を使って「SIGNAL_ARGS」の部分を削除しましたが、抽象的な信号タイプをどのように回避するかわかりません。

1 /私も可能なものはありますか?

2 /これは良いアプローチですか? (私はunordered_map.findのためにいくつかのオーバーヘッドがあることを知っています、特にthis-> call( "signalname"、...)を使うときには重要ですが、それほど重要ではないと思う)

3 /これが不可能な場合や適切な方法でない場合は、他に提案がありますか?

答えて

1

の代わりに、boost::signalsをラップし、boost::shared_ptr<IWrapperSignal>を入れて問題を解決しました。

引数probnlemもboost::function_traits<T>::arg_typeを使用して解決されました。

それを行うのが最善の方法かどうかわかりませんが、うまくいきます。そして、これを継承したクラスでシグナルを宣言するのが簡単です。SignalManager

関連する問題