我有以下内容:
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 :(得分: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
将具有不同的id_
等。)
另一种可能性是将boost::function
存储为客户端会记住的标记,并用于标识删除它时的特定功能。