【发布时间】:2011-07-28 16:42:45
【问题描述】:
情况
我有一个模板类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]);
...
}
所以,问题是:
a) 有什么方法可以遍历不同类型的集合吗?由于函数不是模板,因此无法在此处使用特征类。
b) 有没有更好的方法来存储容器集合 - 不同类型的对象?当它们只是普通模板类的不同特化时,容器本身就非常简单。
【问题讨论】:
标签: c++ templates void-pointers typetraits typelist