2010-12-13 6 views
3

У меня есть следующие:станд :: вектор станд :: функция

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 

И во время компиляции:

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 

Теперь я понимаю, что это из-за того, что хранится в векторе и оператором ==. Есть ли другой способ хранения std::function в контейнере STL? Нужно ли мне обертывать его чем-то другим?

ответ

0

Вы можете хранить boost::function в векторе, если не используете std::find. Поскольку вам, похоже, понадобится это, включение функции в свой класс с равенством было бы, вероятно, лучшим.

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

Обратите внимание, что это требует, чтобы вы сохранить id_ в здравом способом (например, два различных EventFun s будет иметь различные id_ с, и т.д.).

Другой возможностью было бы хранить boost::function с тегом, который клиент будет помнить и использовать для идентификации конкретной функции при ее удалении.

+0

Благодарим за это. Полагаю, моя главная проблема заключается в том, как генерировать этот идентификатор на лету. Я хочу, чтобы читаемость с помощью '+ =' передавала функцию/lambda внутри вектора события. Поэтому я предполагаю, что класс-оболочка должен генерировать идентификатор на основе переданной функции. Возможно, адрес этого? –

Смежные вопросы