【发布时间】:2010-11-05 04:49:30
【问题描述】:
我想为基类和所有派生类部分专门化我无法更改的现有模板 (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,我会按照enable_if 文档的建议添加另一个虚拟模板参数以使用boost::enable_if,但这显然不是一个很好的解决方案。有没有办法解决这个问题?我是否必须在我创建的每个 unordered_set 或 unordered_map 上指定自定义哈希模板,或者为每个派生类完全专门化 hash?
【问题讨论】:
标签: c++ derived-class partial-specialization crtp