是否有可能以某种方式比较两个std::tr1::function<>
对象?如果我有一组function<void(int,float)>
对象并想要添加和删除事件处理程序怎么办?添加是微不足道的,但找到要删除的似乎是不可能的。
2 回答
做不到,简单的说。std::function
(在它的所有迭代中,包括boost::function
and std::tr1::function
)不支持operator==
.
根据以下链接中来自 Stack Overflow 的信息,它是可能的,但前提是您将 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;
通过将指针绑定到方法或函数来编写您的 std::function 对象集合。如果您为静态函数执行此操作,请省略 some_object_ptr。
some_func some_method ( std::bind ( some_method_ptr, some_object_ptr, _1, _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 ) );
现在您的 pairID 可以存储在向量或其他容器/数组中。只需确保保持索引对齐,以便哈希始终对应于正确的 std::function 对象,然后您可以使用 find ( ) 获取迭代器到其位置和距离 ( ) 将迭代器转换为所需的索引。
请注意,每次生成容器时都必须这样做。由于它基于指针,因此哈希值会随着程序的不同运行而变化。