2010-12-13 20 views
3

Ich habe folgendes:std :: vector von std :: function

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 

Und während der Kompilierung:

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 
Jetzt

, verstehe ich das, weil von dem, was in dem Vektor gespeichert wird und der Bediener ==. Gibt es eine andere Möglichkeit, std::function in einem STL-Container zu speichern? Muss ich etwas anderes einpacken?

Antwort

0

Sie können boost::function im Vektor speichern, sofern Sie nicht std::find verwenden. Da Sie dies scheinbar benötigen, wäre es wahrscheinlich das Beste, die Funktion in ihre eigene Klasse mit Gleichheit zu bringen.

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

Beachten Sie, dass dies erfordert, dass Sie die id_ in einer vernünftigen Art und Weise halten (z. B. zwei verschiedene EventFun s wird id_ s unterschiedliche, etc.).

Eine andere Möglichkeit wäre, boost::function s mit einem Tag zu speichern, an den sich der Client erinnern und mit dem er die jeweilige Funktion zum Löschen identifizieren würde.

+0

Danke dafür. Ich denke, mein Hauptanliegen ist, wie ich diese ID im Handumdrehen erstelle. Ich möchte die Lesbarkeit der Verwendung des '+ =', um eine Funktion/Lambda in den Ereignisvektor zu übergeben. Ich denke, die Wrapperklasse muss die ID basierend auf der übergebenen Funktion generieren. Vielleicht die Adresse? –