У меня есть класс Base
и классы Derived_1
, Derived_2
... Мне нужны производные классы, чтобы иметь идентификатор. Эти идентификаторы используются для дальнейшего поиска и т. д., поэтому они должны быть последовательными (а не просто случайными числами). Поскольку производные классы создаются пользователем, id не может быть членом Derived_N
. Так что я придумал DerivedType
класс.
class DerivedType
{
static unsigned id;
unsigned m_id;
public:
DerivedType() : m_id(id++) { }
}
Теперь я хочу создать сопоставление между Derived_N
и DerivedType
. Всякий раз, когда создается Derived_N
, это сопоставление проверяет, существует ли DerivedType
для конкретного Derived_N
, и возвращает его, в противном случае создает новое и сохраняет в карте.
Актуальный вопрос: есть ли способ использовать std::map
с типом данных в качестве ключа на карте? Я не боюсь никаких шаблонно-метапрограммных решений. Или есть элегантный способ, как достичь моей цели?
редактировать Тип даты -> Тип данных, я имею в виду ClassType, извините :)
Я хочу использовать его как:
Derived_5 d;
DerivedType dt = getType(d); //Derived_5 is looked up in map, returning particular DerivedType
dt.getId();
каждый экземпляр Derived_N
(с одинаковым «N») должен иметь один и тот же идентификатор через DerivedType.
EDIT2 – МОЙ ОТВЕТ Я нашел лучшее решение для своей проблемы... Вот оно:
atomic_counter s_nextEventClassID;
typedef int cid_t;
template<class EventClass>
class EventClassID
{
public:
static cid_t getID()
{
static cid_t classID = EventClassID::next();
return classID;
}
static cid_t next() { return ++s_nextEventClassID; }
};
поскольку мой вопрос заключался в том, как использовать тип данных на карте, я отмечу некоторые из ваших ответов, спасибо