Chciałbym zdefiniować specjalizację szablon C++, która dotyczy wszystkich podklas danej klasy bazowej. czy to możliwe?Specjalizacja szablonu dla wszystkich podklas
W szczególności chciałbym to zrobić dla hash STL's <>. hash <> jest zdefiniowany jako pusty parametryzowaną szablonu, a rodzinę specjalności dla poszczególnych typów:
template<class _Key>
struct hash { };
template<>
struct hash<char>
{
size_t
operator()(char __x) const
{ return __x; }
};
template<>
struct hash<int>
{
size_t
operator()(int __x) const
{ return __x; }
};
...
chciałbym zdefiniować tak:
template<class Base>
struct hash {
size_t operator()(const Base& b) const {
return b.my_hash();
}
};
class Sub : public Base {
public:
size_t my_hash() const { ... }
};
i móc używać go jak to:
hash_multiset<Sub> set_of_sub;
set_of_sub.insert(sub);
Jednak moje konflikty szablonów mieszających ze standardowym z STL. Czy istnieje sposób (być może przy użyciu cech) do zdefiniowania specjalizacji szablonu, która dotyczy wszystkich podklas danej klasy bazowej (bez modyfikowania definicji STL)?
Zauważ, że wiem, że mogę to zrobić z kilku dodatkowych parametrów szablonu, gdy jest to potrzebne specjalizacja hash, ale chciałbym tego uniknąć, jeśli to możliwe:
template<>
struct hash<Base> {
size_t operator()(const Base& b) const {
return b.my_hash();
}
};
....
// similar specialization of equal_to is needed here... I'm glossing over that...
hash_multiset<Sub, hash<Base>, equal_to<Base> > set_of_sub;
set_of_sub.insert(sub);
jeśli jest to sprzeczne, dlaczego nie używać przestrzeni nazw? – Arunmu
Możliwy duplikat http://stackoverflow.com/questions/1032973/how-to-partially-specialize-a-class-template-for-all-derived-types –
... gdzie rozwiązaniem jest podanie wszystkich pochodne klasy w podobny sposób, który nie jest całkiem zadowalający. – jpalecek