Temel sınıf ve türetilmiş sınıflar için değiştiremediğim (std::tr1::hash
) mevcut bir şablonu kısmen uzmanlaştırmak istiyorum. Nedeni, polimorfizm için merakla tekrar eden şablon desenini kullanıyorum ve karma işlevi CRTP taban sınıfında uygulanmış olmasıdır.Türetilmiş türler için bir sınıf şablonunun kısmen nasıl uzmanlaştırılır?
namespace std { namespace tr1 {
template <typename Derived>
struct hash<CRTPBase<Derived> >
{
size_t operator()(const CRTPBase<Derived> & base) const
{
return base.hash();
}
};
} }
Ama bu uzmanlık gerçek türetilmiş sınıfları, sadece CRTPBase<Derived>
eşleşmiyor: Ben sadece kısmen bir CRTP temel sınıf için uzmanlaşmak istiyorsanız, o zaman ben sadece yazabilir, kolay. İstediğim şey, yalnızca CRTPBase<Derived>
'dan kaynaklanıyorsa Derived
için kısmi bir uzmanlık yazmanın bir yoludur. Benim sözde kod
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();
}
};
} }
... ama derleyici
enable_if<condition, Derived>::type
Derived
olduğunu söyleyemem çünkü çalışmıyor.
std::tr1::hash
'u değiştirebilirsem,
enable_if
belgelerinin önerdiği gibi
boost::enable_if
kullanmak için başka bir kukla şablon parametresi ekleyebilirim, ancak bu kesinlikle çok iyi bir çözüm değildir. Bu problemin bir yolu var mı? Oluşturduğum her
unordered_set
veya
unordered_map
her özel hash şablonunu belirtmeli mi yoksa her türetilmiş sınıf için
hash
tamamen uzmanlaşmalı mıyım? Bunun yerine kendi ad yapmak ve
std::tr1::hash
miras veya
CRTPBase<Derived>
için uzmanlaşmıştır orada yeni bir yapı
hash
tanımlamalıdır
std::tr1::hash
değiştirme
İyi görünüyor, teşekkürler. – Doug