如果我将下面的成员变量更改为使用unordered_map,我会得到一个相当通用的错误:
std::map<Event, std::vector<std::function<void()>>> _observers;
静态断言失败,“指定的哈希不满足哈希要求”
我原以为std::map和std::unordered_map应该是可以互换的。在这种情况下使用unordered_map需要什么哈希要求,为什么会有所不同?
这是我的代码:
#include <functional>
#include <unordered_map>
#include <map>
#include <vector>
#include <utility>
template <typename Event>
class Observable
{
public:
Observable()=default;
template <typename Observer>
void registerObserver(const Event &event, Observer &&observer)
{
_observers[event].push_back(std::forward<Observer>(observer));
}
template <typename Observer>
void registerObserver(Event &&event, Observer &&observer)
{
_observers[std::move(event)].push_back(std::forward<Observer>(observer));
}
void notify(const Event &event) const
{
for (const auto& obs : _observers.at(event)) obs();
}
/* disallow copying */
Observable(const Observable&)=delete;
Observable& operator=(const Observable&)=delete;
private:
std::map<Event, std::vector<std::function<void()>>> _observers;
};
std::unordered_map
,您必须为键专门化std::hash
。 - Some programmer dudeoperator<
:它需要针对最终用作模板参数的实际具体类型进行实现。 - aschepler