2010-12-13 73 views
3

Je donne les résultats suivants:std :: vecteur de std :: fonction

typedef std::function<void(const EventArgs&)> event_type; 

    class Event : boost::noncopyable 
    { 
    private: 
    typedef std::vector<event_type> EventVector; 
    typedef EventVector::const_iterator EventVector_cit; 
    EventVector m_Events; 

    public: 
    Event() 
    { 
    }; // eo ctor 

    Event(Event&& _rhs) : m_Events(std::move(_rhs.m_Events)) 
    { 
    }; // eo mtor 

    // operators 
    Event& operator += (const event_type& _ev) 
    { 
    assert(std::find(m_Events.begin(), m_Events.end(), _ev) == m_Events.end()); 
    m_Events.push_back(_ev); 
    return *this; 
    }; // eo += 

    Event& operator -= (const event_type& _ev) 
    { 
    EventVector_cit cit(std::find(m_Events.begin(), m_Events.end(), _ev)); 
    assert(cit != m_Events.end()); 
    m_Events.erase(cit); 
    return *this; 
    }; // eo -= 
    }; // eo class Event 

Et lors de la compilation: Maintenant, je comprends c'est

1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm(41): error C2451: conditional expression of type 'void' is illegal 
1>   Expressions of type void cannot be converted to other types 

en raison de ce qui est stocké dans le vecteur et l'opérateur ==. Existe-t-il un autre moyen de stocker std::function dans un conteneur STL? Dois-je envelopper quelque chose d'autre?

Répondre

0

Vous pouvez stocker boost::function dans le vecteur, à condition de ne pas utiliser std::find. Puisque vous semblez avoir besoin de cela, envelopper la fonction dans sa propre classe avec l'égalité serait probablement le meilleur.

class EventFun 
{ 
    int id_; 
    boost::function<...> f_; 
public: 
    ... 
    bool operator==(const EventFun& o) const { return id_==o.id_; } // you get it... 
}; 

Notez que cela vous oblige à maintenir la id_ d'une manière saine d'esprit (par exemple. Deux EventFun s auront des id_ s, etc.).

Une autre possibilité serait de stocker boost::function s avec une étiquette le client se souviendrait et utiliser pour identifier la fonction particulière à supprimer.

+0

Merci pour votre aide. Je suppose que ma principale préoccupation est de savoir comment générer cette identification à la volée. Je veux la lisibilité d'utiliser le '+ =' pour passer une fonction/lambda dans le vecteur d'événement. Donc, je suppose que la classe wrapper doit générer l'ID en fonction de la fonction transmise. Peut-être l'adresse de celui-ci? –