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