Mam klasy abstrakcyjnej dla porównywalnych + hashable wartości:C++ meta-programowania: Parametr szablonu, który * musi * dziedziczyć klasę abstrakcyjną
class Key
{
public:
virtual bool operator ==(const Key&) const = 0;
virtual bool operator !=(const Key&) const = 0;
virtual u32 hashcode() const = 0;
};
i trochę betonu klasy C, która dziedziczy to.
class C : public Key
{
private:
u32 a, b;
public:
static const C& null; // a prototype for representing a "no value" C
// Some reasonable implementation; it's just a pair
// ...
};
i chciałbym wdrożyć szablonie klasy Hashset:
template<class T inherits Key, const T& proto> class HashSet
{
//...
};
T jest typem wartości przechowywanych w tych zestawach. proto powinno być instancją T, która jest używana jako "zerowa" wartość typu T dla celów włączenia włączenia. Mam dość doświadczenie z C++, ale nie szczególnie z TMP i chociaż wydaje mi się, że coś, co powinno być krępujące i proste do zrobienia, nie mogę się zorientować, jak coś takiego jak mój pseudo-kod "klasa T dziedziczy klucz" jest w rzeczywistości Sporządzono w C++. Chcę być w stanie stworzyć hash-zestaw wystąpień C jak:
HashSet<C, C::null> myset;
Czy ktoś mógłby mi powiedzieć, co właściwe i idiomatyczne sposób obsłużyć tę sytuację w C++ będzie? Dziękuję Ci!
['std :: enable_if'] (http://en.cppreference.com/w/cpp/types/enable_if) i [' std :: is_base_of'] (http://en.cppreference.com/ w/cpp/types/is_base_of). – Biffen
Nigdy nie zrozumiem, dlaczego "std :: enable_if" ukryty na liście szablonów szablonu podstawowego jest preferowany do 'static_assert' z przyjaznym dla użytkownika komunikatem –
@PiotrSkotnicki Powiedziałbym, że to kompromis pomiędzy ładniejszym komunikat o błędzie i mające ograniczenia typu udokumentowane bezpośrednio w deklaracji, a nie ukryte w definicji. – TartanLlama