std::tr1::hash
変更できない既存のテンプレート ( ) を基本クラスとすべての派生クラスに部分的に特化したいと考えています。その理由は、ポリモーフィズムに奇妙に繰り返されるテンプレート パターンを使用しており、ハッシュ関数が CRTP 基底クラスに実装されているためです。CRTP 基底クラスに部分的に特化したい場合は簡単です。次のように書くだけです。
namespace std { namespace tr1 {
template <typename Derived>
struct hash<CRTPBase<Derived> >
{
size_t operator()(const CRTPBase<Derived> & base) const
{
return base.hash();
}
};
} }
しかし、この特殊化は実際の派生クラスとは一致せず、CRTPBase<Derived>
. 私が欲しいのは、Derived
それがから派生した場合にのみ、部分的な特殊化を書く方法ですCRTPBase<Derived>
。私の疑似コードは
namespace std { namespace tr1 {
template <typename Derived>
struct hash<typename boost::enable_if<std::tr1::is_base_of<CRTPBase<Derived>, Derived>,
Derived>::type>
{
size_t operator()(const CRTPBase<Derived> & base) const
{
return base.hash();
}
};
} }
...しかし、コンパイラはそれenable_if<condition, Derived>::type
がDerived
. を変更できる場合は、ドキュメントで推奨されているように、std::tr1::hash
使用する別のダミー テンプレート パラメータを追加するだけですが、それは明らかにあまり良い解決策ではありません。この問題を回避する方法はありますか? 作成するたびにカスタム ハッシュ テンプレートを指定する必要がありますか、それとも派生クラスごとに完全に特化する必要がありますか?boost::enable_if
enable_if
unordered_set
unordered_map
hash