絞り込むには:現在、Boost.Unorderedを使用しています。私は2つの可能な解決策を見ます:
独自の等式述語とハッシュ関数を定義し、テンプレート(多分
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)
はないと言います(GCC4.7)。何故ですか?
編集3:行#215(Boost 1.49)は、Boostのポインターの特殊化であり、 EDIT2の私のようなカスタム実装を単純にマスクしていることtemplate <class T> std::size_t hash_value(T* const& v)
が
わかりました。したがって、ここでの唯一の方法は、カスタムハッシュファンクターを作成することのようです。boost/functional/hash.hpp
hash_value