Mam klasy Base
i klasy Derived_1
, Derived_2
... Potrzebuję klas pochodnych, aby mieć identyfikator. Te identyfikatory są używane do dalszych wyszukiwań itp., A zatem muszą być kolejne (nie tylko niektóre liczby losowe). Ponieważ klasy pochodne są tworzone przez użytkownika, identyfikator nie może być członkiem Derived_N
. Więc wymyśliłem klasę DerivedType
.Użyj typu danych (typ klasy) jako klucza na mapie
class DerivedType
{
static unsigned id;
unsigned m_id;
public:
DerivedType() : m_id(id++) { }
}
Teraz chcę utworzyć odwzorowanie pomiędzy Derived_N
i DerivedType
. Po utworzeniu Derived_N
to mapowanie wygląda, jeśli DerivedType
dla konkretnej Derived_N
już istnieje i zwraca je, w przeciwnym razie utwórz nowe i zapisuje na mapie.
Rzeczywiste pytanie: Czy jest jakiś sposób na wykorzystanie std::map
z rodzaju danych jak klucza w mapie? Nie boję się żadnego rozwiązania szablon-metaprogram. Czy istnieje elegancki sposób na osiągnięcie mojego celu?
edit Data type -> Typ danych, to znaczy jak ClassType, przykro mi :)
Chcę go używać jak:
Derived_5 d;
DerivedType dt = getType(d); //Derived_5 is looked up in map, returning particular DerivedType
dt.getId();
każdy przypadek Derived_N
(z tego samego " N ") powinny mieć ten sam identyfikator throu DerivedType
EDIT2 - moja odpowiedź znalazłem lepsze rozwiązanie dla mojego problemu ... to li ke to:
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; }
};
gdyż moje pytanie było jak używać typu danych w mapie, będę oznaczyć niektóre z twoich odpowiedzi, dziękuję
to powinna być zaakceptowana odpowiedź – jupp0r
Bardzo dobra odpowiedź, która wykorzystuje nowoczesne C++ – Anonymous