У меня есть универсальный класс, который управляет ресурсами всех типов, но так как я не хочу создавать экземпляр ResourceManager для каждого T, который есть (таким образом, имея один менеджер ресурсов для каждого типа T), ядолжен сделать тип T неизвестным для класса ResourceManager.
Я делаю это, сохраняя карту указателей void * и преобразуя их обратно в требуемый формат, если кто-то запрашивает определенный тип из шаблонного метода Load ();
template <typename T>
T* Load(const std::string &location)
{
//do some stuff here
//everybody take cover!!!
return static_cast<T*>(m_resources[location]);
}
Iиспользуйте специализацию шаблонов, чтобы ввести в класс различных загрузчиков:
template<>
AwesomeType* Load(const std::string &location)
{
//etc.
return static_cast<AwesomeType*>(m_resources[location]);
}
Я знаю, что это некрасиво, но сейчас нет никакого способа обойти это.Я мог бы представить статические карты внутри специализированных методов Load, но таким образом я не могу связать время жизни ресурсов со временем жизни объекта ResourceManager, что является важной функцией.
Но так как этоявляется несколько опасным (так как указатели void * могут быть любыми), я хотел бы по крайней мере проверить во время выполнения, будет ли преобразование работать, поэтому я могу реагировать на него, не вызывая сбой приложения.
Как я могу это сделать?