应聘C++程序员,他们出来一个MFC的问题,急!!求解,感觉这个又容易有好难,可以发邮箱874615679@qq.com
1.使用c++实现一个类似下面的事件类:```cpptemplate<classArg>classEventSource{public:void*operator+=(s...
1.使用c++实现一个类似下面的事件类:
```cpp
template<class Arg>
class EventSource
{
public:
void * operator+=(std::function<void(const Arg&)> func); //注册事件
operator-=(void*);//注销事件
void operator()(const Arg& arg); //触发事件
}
```
要求能按照如下方式使用
```cpp
//一个事件源对象,当鼠标点击的时候触发此事件
EventSource<MouseEvent> onMouseClick;
//注册事件,返回token用来注销事件
void * token = onMouseClick += [&](const MouseEvent& e){ //c++的lambda语法
onMouseClick -= token; //注销事件,要保证能在事件触发的时候安全注销。
}
//在收到类似WM_CLICK消息的时候,触发此事件
onMouseClick(MouseEvent());
``` 展开
```cpp
template<class Arg>
class EventSource
{
public:
void * operator+=(std::function<void(const Arg&)> func); //注册事件
operator-=(void*);//注销事件
void operator()(const Arg& arg); //触发事件
}
```
要求能按照如下方式使用
```cpp
//一个事件源对象,当鼠标点击的时候触发此事件
EventSource<MouseEvent> onMouseClick;
//注册事件,返回token用来注销事件
void * token = onMouseClick += [&](const MouseEvent& e){ //c++的lambda语法
onMouseClick -= token; //注销事件,要保证能在事件触发的时候安全注销。
}
//在收到类似WM_CLICK消息的时候,触发此事件
onMouseClick(MouseEvent());
``` 展开
1个回答
展开全部
#include <functional>
#include <list>
#include <algorithm>
#include <utility>
#include <iostream>
using namespace std;
template<typename EventArg>
class EventSource
{
using HandlerType = function<void(EventArg const&)>;
using HandlerList = list<HandlerType>;
public:
using TokenType = void*;
EventSource() = default;
TokenType operator +=(HandlerType handler)
{
m_handlers.push_back(move(handler));
return &m_handlers.back();
}
void operator -=(TokenType t)
{
m_handlers.remove_if([t](HandlerType const& h) { return &h == t; });
}
void operator ()(EventArg const& v)
{
for (auto it = m_handlers.begin(); it != m_handlers.end();)
{
auto cur = it++;
(*cur)(v);
}
}
private:
EventSource(EventSource&) = delete;
EventSource& operator=(EventSource&) = delete;
HandlerList m_handlers;
};
int main()
{
EventSource<int> intEvent;
auto t1 = intEvent += [](int v)
{
cout << "t1: " << v << endl;
};
auto t2 = intEvent += [&](int v)
{
intEvent -= t1;
cout << "t2: " << v << endl;
};
intEvent(2);
intEvent(3);
}
这个实现比较简单,但是可以工作。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询