缩小范围:我目前正在使用Boost.Unordered。我看到两种可能的解决方案:
定义我自己的平等谓词和散列函数,并利用模板(也许
is_pointer
)来区分指针和实例;简单地
boost::hash
通过提供hash_value(Type* const& x)
散列来扩展;并将==
运算符重载添加为带有参数的自由函数,(Type* const& x, Type* const& y)
以进行相等性检查。
我不确定这两种变化是否真的可行,因为我没有测试它们。我想知道你处理这个问题。欢迎实施:)
编辑1: 这个呢?
template<class T>
struct Equals: std::binary_function<T, T, bool> {
bool operator()(T const& left, T const& right) const {
return left == right;
}
};
template<class T>
struct Equals<T*> : std::binary_function<T*, T*, bool> {
bool operator()(T* const& left, T* const& right) const {
return *left == *right;
}
};
编辑2:
我刚刚定义:
friend std::size_t hash_value(Base const& base) {
boost::hash<std::string> hash;
return hash(base.string_);
}
friend std::size_t hash_value(Base* const& base) {
return hash_value(*base);
}
进而:
Derived d1("x");
Derived d2("x");
unordered_set<Base*> set;
set.insert(&d1);
assert(set.find(&d2) == end());
调试器说friend std::size_t hash_value(Base* const& base)
永远不会调用(GCC 4.7)。这是为什么?
编辑 3:
我发现template <class T> std::size_t hash_value(T* const& v)
在boost/functional/hash.hpp
第 215 行(Boost 1.49)是 Boost 对指针的专门化,它只是掩盖了您在EDIT 2hash_value
中的自定义实现,例如我的。因此,这里似乎唯一的方法是创建一个自定义 Hash Functor。