【问题标题】:Comparing std::function<>比较 std::function<>
【发布时间】:2011-08-16 08:47:55
【问题描述】:

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

【问题讨论】:

  • @James:我不同意。问题不是问为什么不是,而是问是否是。如果你想找到那个问题,你必须已经知道它不是。
  • @DeadMG: 很公平,但是 Comparing std::tr1::function<> objects 的重复,然后
  • @mmutz:他们很接近,但我仍然不会打电话给骗子。 TR1 库可以具有与 C++0x 库不同的规范。

标签: c++ c++11 tr1


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    std::vector of 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 为你的函数创建一个唯一的散列,并将它与 std::pair 一起用于方法。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-04
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      相关资源
      最近更新 更多