2012-01-11 180 views
2

我有一个Event类。在AddHandler(thisPtr, callback)我对thisPtrcallback使用tr1::bind,最终我有一个列表:如何在C++事件中实现删除处理程序

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

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

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

+0

也许你应该只是返回插入对象的迭代器。另外,请检查Boost.Signals2,libsigC++等。 – kennytm 2012-01-11 17:19:31

回答

1

由于您使用的一个标准::名单,从未无效迭代器,只要该元素停留在容器中,你可以使用一个迭代器来跟踪你插入的功能。例如:

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); 
+0

我不希望用户保存迭代器。如何查找给定'RemoveHandler(thisPtr,memberPtr)'的正确迭代器? – Leo 2012-01-11 18:01:21

+0

@Leo:你需要有一些方法可以识别'std :: function'。正如你所知道的,你无法比较它们自身的功能。您可以将函数存储在一对具有相似值的对中(可能在地图中),如整数,然后通过该值查找函数。用户仍然需要存储该值以便稍后识别该功能。如果这是不可接受的,我想不出有助于你的解决方案。 – 2012-01-11 18:18:00

+0

为什么用户除了自己的指针和成员函数之外还记得任何东西(比如在C#中)?我可以使用这两个值作为可比较的吗? – Leo 2012-01-11 18:23:23