2016-07-20 6 views
1

私はシンプルな "デリゲート"システムでゲームを進めています。コールバック付きバリデーションテンプレートの使用

#ifndef C_DELEGATE_HPP_ 
#define C_DELEGATE_HPP_ 


#include <list> 
#include <functional> 

#include <boost/function.hpp> 


namespace ns 
{ 


//////////////////////////////////////////////////////////////////////////////// 
/// Classe gérant une liste de callback. Les callbacks ont entre 0 et 1 
/// arguments. 
/// 
template <typename ... Args> 
class C_Delegate 
{ 

public: 

    //////////////////////////////////////////////////////////////////////////// 
    /// Type des callbacks. 
    /// 
    typedef std::function<void (Args...)> callback; 




    //////////////////////////////////////////////////////////////////////////// 
    /// Structure répresentant un callback. 
    /// 
    struct S_Callback 
    { 

     callback callback_ptr; 

     bool  once; 

    }; // S_Callback 




    //////////////////////////////////////////////////////////////////////////// 
    /// Type pour la liste des callbacks. 
    /// 
    typedef std::list <S_Callback> callback_list; 



public: 

    //////////////////////////////////////////////////////////////////////////// 
    /// Constructeur. 
    /// 
    C_Delegate (void) 
    { } 


    //////////////////////////////////////////////////////////////////////////// 
    /// Destructeur. 
    /// 
    virtual ~C_Delegate (void) throw() 
    { } 




    //////////////////////////////////////////////////////////////////////////// 
    /// Connecte une fonction à la liste des callbacks. 
    /// 
    /// @param cb : Callback. 
    /// @param instance : Instance de l'objet utilisant le callback. 
    /// @param once : Détermine si le callback est appelé que une fois ou non. 
    /// 
    void connect (callback cb, bool once=false) throw() 
    { 

     _callbacks.push_back ({cb, once}); 

    } 


    //////////////////////////////////////////////////////////////////////////// 
    /// Déconncte une fonction de la liste. 
    /// 
    /// @param cb : Callback. 
    /// @param instance : Instance de l'objet utilisant le callback. 
    /// 
    void disconnect (callback cb) throw() 
    { 
     for (auto i = _callbacks.begin(); i != _callbacks.end(); i++) { 
      if (i->callback_ptr == cb) { 
       _callbacks.erase(i); 
       return; 
      } 
     } 
    } 




    //////////////////////////////////////////////////////////////////////////// 
    /// Appels tous les callbacks lé à l'objet actuel. 
    /// 
    /// @param a1 : Argument à passer aux callbacks. 
    /// 
    void emit(Args... args) throw() 
    { 
     for (auto i = _callbacks.begin(); i != _callbacks.end(); i++) 
     { 
      i->callback_ptr(args...); 

      if (i->once) 
       _callbacks.erase (i); 
     } 
    } 



private: 

    //////////////////////////////////////////////////////////////////////////// 
    /// Liste des callbacks. 
    /// 
    callback_list _callbacks; 


}; // C_Delegate 


} // namespace ns 

#endif 

リンターは何も言っていない、良い:ここで

は、(フランスのコメントは申し訳ありません)ソースファイルです。しかし、 C_Delegate<void>を使用すると、このエラーが発生します: invalid parameter type 'void'

C_Delegate::emitメソッドでパラメータコールバックを使用できないようにするにはどうすればよいですか?

ありがとうございました!

答えて

3

空のパラメータパックの綴りは、<>ではなく、<void>です。 C_Delegate<>をお試しください。ところで

は、彼らが varargsは通常 C ...を参照し、可変引数テンプレートと呼ばれています。

+0

ありがとう、私は今日物事を学ぶ! –

1

C_Delegate<void>の代わりに、引数がない場合はC_Delegate<>を使用してください。

関連する問題