应聘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());
```
展开
 我来答
seizeF
2014-07-02 · TA获得超过412个赞
知道小有建树答主
回答量:207
采纳率:0%
帮助的人:227万
展开全部
#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);
}

 这个实现比较简单,但是可以工作。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式