【问题标题】:How to implement remove handler in C++ event如何在 C++ 事件中实现删除处理程序
【发布时间】:2012-01-11 16:58:39
【问题描述】:

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

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

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

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

【问题讨论】:

  • 也许你应该只返回插入对象的迭代器。另外,检查 Boost.Signals2、libsigc++ 等。

标签: c++ events delegates bind


【解决方案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);

【讨论】:

  • 我不希望用户保存迭代器。如何查找给定RemoveHandler(thisPtr, memberPtr) 的正确迭代器?
  • @Leo:你需要有一些方法来识别std::function。如您所知,您无法比较函数本身。您可以将函数存储在具有一些可比较值(可能在映射中)的一对中,例如整数,然后通过该值查找函数。用户仍然需要存储该值以便以后识别函数。如果这不可接受,我想不出对您有帮助的解决方案。
  • 为什么用户要记住除了自己的 this 指针和成员函数之外的任何东西(就像在 C# 中一样)?我可以将这两个值用作可比值吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
  • 2015-05-22
相关资源
最近更新 更多