8

是否有可能以某种方式比较两个std::tr1::function<>对象?如果我有一组function<void(int,float)>对象并想要添加和删除事件处理程序怎么办?添加是微不足道的,但找到要删除的似乎是不可能的。

4

2 回答 2

8

做不到,简单的说。std::function(在它的所有迭代中,包括boost::functionand std::tr1::function)不支持operator==.

于 2011-05-01T07:19:40.410 回答
5

根据以下链接中来自 Stack Overflow 的信息,它是可能的,但前提是您将 std::function 对象包装在它自己的类中。

std::vector 的 std::function

通过使用包装类,您可以测试两个包装的 std::function 指针是否相等,但这并不能告诉您 std::function 包装的内容。所以,改变你的设计可能是一个更好的方法。

编辑:我回来展示我解决一个非常相似的问题的方式。

0) 简洁的类型定义。

    using std::placeholders;
    typedef std::function < void ( int, float ) > some_func;
    typedef std::pair < intptr_t, intptr_t > method_hash;
  1. 通过将指针绑定到方法或函数来编写您的 std::function 对象集合。如果您为静态函数执行此操作,请省略 some_object_ptr。

    some_func some_method ( std::bind ( some_method_ptr, 
                                        some_object_ptr, _1, _2 ) 
    
  2. 使用 std::reinterpret_cast < intptr_t > 为您的函数创建一个唯一的哈希,并将其与 std::pair 一起用于方法。

     method_hash pairID ( reinterpret_cast < intptr_t > ( some_object_ptr ), 
                          reinterpret_cast < intptr_t > ( some_method_ptr ) );
    
  3. 现在您的 pairID 可以存储在向量或其他容器/数组中。只需确保保持索引对齐,以便哈希始终对应于正确的 std::function 对象,然后您可以使用 find ( ) 获取迭代器到其位置和距离 ( ) 将迭代器转换为所需的索引。

请注意,每次生成容器时都必须这样做。由于它基于指针,因此哈希值会随着程序的不同运行而变化。

于 2013-09-25T09:46:13.437 回答