我的理解是正确的,不能同时使用std::function
,std::map
和无序关联容器(即std::set
,std::unordered_map
)和std::unordered_set
作为键?
背景是我实现了一个计时器驱动的观察器,即本例中的主题。我给观察者一个std::function<void(void)>
对象,以便再次取消订阅。当然,在调用此取消订阅功能时,主题必须保留应取消钩住/删除哪些回调。
[因此,我自然而然地考虑使用std::function
的副本作为std::map
或std::unordered_map
的键。为了希望像语义一样的函数指针,我希望使用equal运算符,它是std::function
实例的less或hash实现。我在阅读参考文献/标准时遇到的莫名其妙的事情是:operator==
和operator!=
不能按预期工作,因为它们只是与空的(即默认构造的函数对象)进行比较。
但是,尽管我阅读了23.14.7和我的一般理解,但我应该能够在上述容器中直接使用std::function
实例化,因为它们使用std::equal_to
而不是直接使用==
吧?
同样,身份,即std::equal_to
/总顺序将匹配两个“指向”指向相同回调的函数对象,对吗?
背景是我实现了一个计时器驱动的观察器,即本例中的主题。我给观察者一个std :: function对象,以便再次取消订阅。
不要这样做。
相反,将迭代器返回到您存储了订阅者可以用来退订的功能对象的容器。