std ::用作关联容器中的键

问题描述 投票:3回答:1

我的理解是正确的,不能同时使用std::functionstd::map和无序关联容器(即std::setstd::unordered_map)和std::unordered_set作为键?

背景是我实现了一个计时器驱动的观察器,即本例中的主题。我给观察者一个std::function<void(void)>对象,以便再次取消订阅。当然,在调用此取消订阅功能时,主题必须保留应取消钩住/删除哪些回调。

[因此,我自然而然地考虑使用std::function的副本作为std::mapstd::unordered_map的键。为了希望像语义一样的函数指针,我希望使用equal运算符,它是std::function实例的less或hash实现。我在阅读参考文献/标准时遇到的莫名其妙的事情是:operator==operator!=不能按预期工作,因为它们只是与空的(即默认构造的函数对象)进行比较。

但是,尽管我阅读了23.14.7和我的一般理解,但我应该能够在上述容器中直接使用std::function实例化,因为它们使用std::equal_to而不是直接使用==吧?

同样,身份,即std::equal_to /总顺序将匹配两个“指向”指向相同回调的函数对象,对吗?

c++ c++17 std-function
1个回答
0
投票

背景是我实现了一个计时器驱动的观察器,即本例中的主题。我给观察者一个std :: function对象,以便再次取消订阅。

不要这样做。

相反,将迭代器返回到您存储了订阅者可以用来退订的功能对象的容器。

© www.soinside.com 2019 - 2024. All rights reserved.