gpt4 book ai didi

c++ - 在 C++ 中遍历不同类型的集合

转载 作者:搜寻专家 更新时间:2023-10-31 01:18:42 24 4
gpt4 key购买 nike

情况

我有一个模板类 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) 是否有某种方法可以遍历不同类型的集合?不能在这里使用 traits 类,因为函数是非模板的。

b) 是否有更好的方法来存储容器集合 - 不同类型的对象?当它们只是通用模板类的不同特化时,容器本身非常简单。

最佳答案

我认为来自 boost 库的类变体 ( boost::variant ) 可能对您有所帮助。您可以使用访问者根据变体中存储的类型执行适当的代码。 std::vector<boost::variant<T0, T1,...>>可以存储不同类型的对象列表。

由于您的对象相似,它们在内存中的大小可能相同,这是一件好事,因为 boost::variant存储是基于堆栈的(没有堆分配 - 这样更快)。

关于c++ - 在 C++ 中遍历不同类型的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6862538/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com