Ho una classe astratta per i valori comparabili + hashable:C++ meta-programmazione: un parametro di template che * deve * ereditare una classe astratta
class Key
{
public:
virtual bool operator ==(const Key&) const = 0;
virtual bool operator !=(const Key&) const = 0;
virtual u32 hashcode() const = 0;
};
e un po 'di classe C concreta che eredita questo.
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
// ...
};
e desidero implementare una classe HashSet template:
template<class T inherits Key, const T& proto> class HashSet
{
//...
};
T è il tipo di valori memorizzati in questi gruppi. proto dovrebbe essere un'istanza di T che viene utilizzata come valore "null" di tipo T ai fini dell'inclusione dell'insieme. Ho ragionevolmente esperienza con C++ ma non particolarmente con TMP e, sebbene sembri qualcosa che dovrebbe essere imbarazzantemente semplice da estrarre, non riesco a capire come qualcosa del mio pseudo-codice "classe T erediti Key" sia effettivamente fatto in C++. Voglio essere in grado di creare un hash-serie di istanze di C come:
HashSet<C, C::null> myset;
Qualcuno può per favore mi dica cosa il modo corretto e idiomatica per gestire questa situazione in C++ sarebbe? Grazie!
['std :: enable_if'] (http://en.cppreference.com/w/cpp/types/enable_if) e [' std :: is_base_of'] (http://en.cppreference.com/ w/cpp/tipi/is_base_of). – Biffen
Non capirò mai perché un 'std :: enable_if' nascosto in un elenco di parametri template di un modello primario sia preferito a un' static_assert' con un messaggio user-friendly –
@PiotrSkotnicki Direi che è un compromesso tra un migliore messaggio di errore e avere i vincoli di tipo documentati direttamente nella dichiarazione piuttosto che nascosti nella definizione. – TartanLlama