У меня есть абстрактный класс для сопоставимых + хешируемых значений:
class Key
{
public:
virtual bool operator ==(const Key&) const = 0;
virtual bool operator !=(const Key&) const = 0;
virtual u32 hashcode() const = 0;
};
и некоторый конкретный класс C, который наследует это.
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 just a pair
// ...
};
и я хотел бы реализовать шаблонный класс HashSet:
template<class T inherits Key, const T& proto> class HashSet
{
//...
};
T - тип значений, хранящихся в этих наборах. proto должен быть экземпляром T, который используется как "нулевое" значение типа T для целей включения. Я достаточно опытен с С++, но не особенно с TMP и, хотя кажется, что-то, что должно быть смущающе просто для снятия, я не могу понять, как что-то вроде моего псевдокода "класс T наследует Key" выполняется на С++. Я хочу иметь возможность создавать хеш-набор экземпляров C как:
HashSet<C, C::null> myset;
Может кто-нибудь, пожалуйста, скажите мне, какой правильный и идиоматический способ справиться с этой ситуацией на С++? Спасибо!