У меня есть класс Base
и классы Derived_1
, Derived_2
... Мне нужны производные классы, чтобы иметь идентификатор.Эти идентификаторы используются для дальнейших поисков и т. Д. И, следовательно, должны быть последовательными (а не просто случайными числами).Поскольку производные классы создаются пользователем, идентификатор не может быть членом 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
с типом данных как ключ на карте?Я не боюсь ни одного шаблона-метапрограммы.Или есть элегантный способ достижения моей цели?
edit Тип даты -> Тип данных, я имею в виду, как 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 - МОЙ ОТВЕТ Iнашел лучшее решение для моей проблемы ... Это так:
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; }
};
, поскольку мой вопрос был о том, как использовать тип данных на карте, я отмечу некоторые из ваших ответов, спасибо