Ситуация
У меня есть шаблон класса 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
- это enum, значения которого соответствуют фактическим типам.Все управление осуществляется в шаблонном классе 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]);
...
}
Итак, вопросы:
а) Есть ли способ перебора коллекции разных типов?Здесь нельзя использовать класс признаков, так как функция не является шаблоном.
б) Есть ли лучший способ хранения коллекции контейнеров - объектов другого типа?Когда они являются просто другой специализацией общего класса шаблона, сами контейнеры довольно просты.