【发布时间】:2020-05-18 11:37:58
【问题描述】:
我的理解是否正确,不能使用std::function 作为既没有有序的键,即std::map,std::set,也没有无序的关联容器,即std::unordered_map,std::unordered_set?
背景是我实现了一个计时器驱动的观察者,即本例中的主题。我给观察者一个std::function<void(void)> 对象以便再次取消订阅。当然,当这个取消订阅函数被调用时,主题必须保持哪些回调应该被取消/删除。
我很自然地考虑使用std::function 的副本作为std::map 或std::unordered_map 的键。希望函数指针类似于语义,我希望相等运算符,std::function 实例化的 less 或 hash 实现。我在阅读参考资料/标准时遇到的莫名其妙的事情是:operator== 和 operator!= 没有按预期工作,因为它们仅与空的即默认构造的函数对象进行比较。
但是,当我阅读 23.14.7 和我的一般理解时,我应该能够在上述容器中使用开箱即用的 std::function 实例化,因为它们使用 std::equal_to 而不是直接使用 == 对吗?
身份,即std::equal_to/total 顺序将匹配两个“指向”相同回调的函数对象,对吧?
【问题讨论】:
-
我认为
std::equal_to无论如何都会使用默认的==,并且由于==仅适用于std::nullptr_t类型,因此您不能按照您的描述进行操作。 -
@Superlokkus 你在哪里看到这样的东西?我在 func.wrap.func 中找不到任何这些(哈希、减和算术运算符)。
标签: c++ c++17 std-function