2016-07-20 3 views
1

Ich arbeite an einem Spiel mit einem einfachen "Delegierten" -System. HierVariadische Vorlagen mit Rückrufen verwenden

ist die Quelldatei (sorry für die französisch Kommentare):

#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 

Die Linter sagt nichts, gut. Aber mit C_Delegate<void> erstellen Sie diesen Fehler: invalid parameter type 'void'.

Wie kann ich meine C_Delegate::emit Methode machen, um keine Parameter Callback zu verwenden?

Vielen Dank für Ihre Antworten!

Antwort

3

Das leere Parameterpaket ist geschrieben <> nicht <void>. Versuchen Sie es mit C_Delegate<>.

Übrigens heißen sie variadic Schablonen, varargs beziehen sich normalerweise auf die C....

+0

Danke, ich lerne heute etwas! –

1

Verwenden Sie C_Delegate<> für keine Argumente anstelle von C_Delegate<void>.