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

时间:2012-01-11 16:58:39

标签: c++ events delegates bind

我有一个Event类。在AddHandler(thisPtr, callback)我在tr1::bindthisPtr上使用callback,最后我有一个列表:

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

但如果tr1::function不具有可比性,我怎样才能实现删除处理程序方法?

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

1 个答案:

答案 0 :(得分:1)

由于您正在使用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);