如何在C++事件中实现remove处理程序

How to implement remove handler in C++ event

本文关键字:实现 remove 处理 程序 事件 C++      更新时间:2023-10-16

我有一个Event类。在AddHandler(thisPtr, callback)中,我在thisPtrcallback上使用tr1::bind,最终我有了一个列表:

typedef std::tr1::function<void( int& )> CallbackFunction;
std::list< CallbackFunction > m_handlers;

但是,如果tr1::function不可比较,我如何实现remove处理程序方法?

我应该保留一个从对象指针和回调到tr1::function的映射,并删除一个具有相同对象指针和指向RemoveHandler中参数的回调指针的映射吗?这是一种安全的方法吗?

由于您使用的是std::list,它从不使迭代器无效,因此只要元素留在容器中,就可以使用迭代器来跟踪您插入的函数。示例:

typedef std::list<CallbackFunction> func_list;
typedef typename func_list::iterator func_it;
func_it Insert(func_list & l, Callback c)
{
    l.insert(l.begin(), c);
    return l.begin();
}

现在,您可以调用该函数来插入回调,它将向它返回一个迭代器,您可以使用它来删除它,如下所示:

func_it it = Insert(l, c);
l.erase(it);