Tengo la clase World
que gestiona la creación del objeto ... Después de la creación, llama al método afterCreation
y el objeto creado es de tipo definido por el usuario derivado de la entidad (por ejemplo MyEntity
), Quiero llamar al addEntity
. Yo el objeto era otra cosa, no quiero hacer nada. addEntity
debe ser llamado con T
adecuada, ya que genera identificadores únicos para cada clase derivada etc.Cómo especializar la plantilla para el tipo derivada del tipo particular
Aquí está mi solución:
template <int v>
struct ToType
{
enum { value = v };
};
template <typename T>
void World::afterCreation(T * t)
{
afterCreation(t, ToType<std::is_base_of<Entity, T>::value>());
}
template <typename T>
void World::afterCreation(T * t, ToType<true>)
{
addEntity(t); //here I cant pass Entity *, I need the real type, eg. MyEntity
}
template <typename T>
void World::afterCreation(T * t, ToType<false>)
{
}
Mi pregunta es - ¿Puede hacerse en forma mejor?
¿Cómo puedo simular el código siguiente sin ToType
o similar?
template <typename T>
void afterCreation(){/*generic impl*/}
template <typename T where T is derived from Entity>
void afterCreation(){/*some specific stuff*/}
- "especializan" en el título es sólo para describir mi intención, no hay necesidad de resolver un problema en esta especialización de plantilla
Eddie Edwards: simplemente pasando el puntero del objeto sobre el que desea que se ejecute. 'Entidad x; afterCreation (&x);) . – orlp
+1, simple y al grano :) Resuelve el problema real, en lugar de lo que pregunta la pregunta (con un enfoque mucho más simple que SFINAE --Estoy asumiendo que nada en la función solo compilará ' Tipos derivados de Entity', es decir, no hay nada como 'entity-> getEntityName()' que no compilará para tipos derivados de Entity no) –
Sorry nightcracker Retiré mis comentarios (y se aplicaron a su respuesta no editada) Creo que un gran cantidad de compiladores eliminará dynamic_cast ya que tiene pleno conocimiento del tipo de x. O, al menos, todo el conocimiento que necesita, suponiendo que la solución con plantilla pueda funcionar en absoluto. –