Tengo clase Base
y clases Derived_1
, Derived_2
... Necesito clases derivadas para tener una identificación. Esos ids se utilizan para búsquedas posteriores, etc., y por lo tanto deben ser consecutivos (no solo algunos números aleatorios). Como las clases derivadas las crea el usuario, el ID no puede ser miembro de Derived_N
. Así que se me ocurrió la clase DerivedType
.Usar tipo de datos (tipo de clase) como clave en un mapa
class DerivedType
{
static unsigned id;
unsigned m_id;
public:
DerivedType() : m_id(id++) { }
}
Ahora quiero crear una correlación entre Derived_N
y DerivedType
. Siempre que se cree Derived_N
, esta asignación se ve si DerivedType
para el particular Derived_N
ya existe y la devuelve; de lo contrario, cree una nueva ubicación y almacene en el mapa. ¿Hay alguna manera de utilizar std::map
con el tipo de datos como clave en el mapa: pregunta real
? No le temo a ninguna solución de plantilla-metaprograma. ¿O hay una forma elegante de lograr mi objetivo?
editar texto Fecha -> Tipo de datos, es decir, como ClassType, lo siento :)
quiero usarlo como:
Derived_5 d;
DerivedType dt = getType(d); //Derived_5 is looked up in map, returning particular DerivedType
dt.getId();
cada instancia de Derived_N
(con mismo ' N ') debe tener el mismo ID throu DerivedType
Edit2 - mi respuesta he encontrado mejor solución para mi problema ... es li ke esto:
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; }
};
ya que mi pregunta era cómo utilizar el tipo de datos en un mapa, que marcará algunos de los suyos respuestas, gracias
esta debería ser la respuesta aceptada – jupp0r
Muy buena respuesta que utiliza el moderno C++ – Anonymous