У меня есть класс World
, который управляет созданием объекта ... После создания он вызывает метод afterCreation
, и я создал объект определенного пользователем типа, производного от Entity (например, MyEntity
), я хочу вызватьaddEntity
.У меня объект был чем-то другим, я ничего не хочу делать.addEntity
должен вызываться с соответствующим T
, потому что он генерирует уникальные идентификаторы для каждого производного класса и т. Д.
Вот мое решение:
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>)
{
}
Мой вопрос - может быть всделано лучше?
Как я могу смоделировать следующий код без ToType
или подобного?
template <typename T>
void afterCreation(){/*generic impl*/}
template <typename T where T is derived from Entity>
void afterCreation(){/*some specific stuff*/}
- «специализировать» в названии только для описания моих намерений, нет необходимостирешить проблему со специализацией шаблона