我想部分專門化一個我無法更改的現有模板(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
?
看起來不錯,謝謝。 – Doug 2009-06-24 10:49:37