Ситуация
У меня есть класс шаблона TIppImage<T>
для изображения типа T
. У меня есть одноэлементный класс CIppMemoryManager
, который может хранить несколько изображений разного размера и типа.
class CIppMemoryManager
{
public:
/// ... Singleton interface ...
template<class T> TIppImage<T>* GetImage(width, height);
private:
CIppMemoryManager();
~CIppMemoryManager();
std::map<IppDataType, void*> m_Containers;
};
IppDataType
— это перечисление, значения которого соответствуют фактическим типам. Все управление осуществляется в классе шаблонов TIppImageContainer<T>
. И вся специализация этого класса хранится в m_Containers
как void*
. Это не очень хорошо, но это, по крайней мере, просто.
При таком подходе я могу просто реализовать метод шаблона GetImage
следующим образом:
template<class T> TIppImage<T>* CIppMemoryManager::GetImage(width, height)
{
return reinterpret_cast<TIppImageContainer<T>*>(m_Containers[
TIppTypeTraits<T>::ipp_data_type])->GetImage(width, height);
}
где я использую класс признаков TIppTypeTraits<T>
для получения значения перечисления из данного типа.
Проблема
Я не могу просто реализовать нешаблонные методы, такие как конструктор. Мне нужно явно обрабатывать все возможные типы:
CIppMemoryManager::CIppMemoryManager()
{
m_Containers[ipp8u] = new CIppImageContainer<Ipp8u>;
m_Containers[ipp8s] = new CIppImageContainer<Ipp8s>;
m_Containers[ipp16u] = new CIppImageContainer<Ipp16u>;
m_Containers[ipp16s] = new CIppImageContainer<Ipp16s>;
...
}
Хуже того, для деструктора мне также нужно иметь дело с void*
:
CIppMemoryManager::~CIppMemoryManager()
{
delete reinterpret_cast<TIppImageContainer<Ipp8u>*>(m_Containers[ipp8u]);
delete reinterpret_cast<TIppImageContainer<Ipp8s>*>(m_Containers[ipp8s]);
delete reinterpret_cast<TIppImageContainer<Ipp16u>*>(m_Containers[ipp16u]);
delete reinterpret_cast<TIppImageContainer<Ipp16s>*>(m_Containers[ipp16s]);
...
}
Итак, вопросы:
а) Есть ли способ перебирать коллекцию разных типов? Здесь нельзя использовать класс свойств, так как функция не является шаблоном.
б) Есть ли лучший способ хранить коллекцию контейнеров - объектов разного типа? Когда они являются просто другой специализацией общего класса шаблонов, сами контейнеры довольно просты.