gpt4 book ai didi

function - std::vector 的 std::function

转载 作者:行者123 更新时间:2023-12-01 15:35:31 25 4
gpt4 key购买 nike

我有以下内容:

  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 容器中吗?我需要用其他东西包裹它吗?

最佳答案

如果不使用 std::find,您可以将 boost::function 存储在向量中。由于您似乎需要它,因此将函数平等地包装在它自己的类中可能是最好的。

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,客户端会记住并使用它来识别删除它时的特定函数。

关于function - std::vector 的 std::function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4430425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com