首先:我搜索了一半的网络以找到 this 的答案。作为最接近的解决方案。然而,它对我来说太重了,所以我看起来不那么复杂。
然后,一些上下文:我正在构建一个系统,它应该能够处理来自队列的传入消息,然后将这些消息的结果存储在另一个队列中。我想将这些响应存储在通用类中,因为我将其存储在 multimap
中。
目前响应类定义如下
class COutboundMsg
{
public:
enum eTypeHint {
thNone,
thSomeType,
thLast
};
eTypeHint m_TypeHint;
void* m_OutboundData;
COutboundMsg(COutboundMsg::eTypeHint TypeHint, void* data);
};
COutboundMsg::COutboundMsg(COutboundMsg::eTypeHint TypeHint, void* data) :
m_TypeHint(TypeHint),
m_OutboundData(data)
{
}
现在,当前的工作方式需要用户执行如下操作:
CSomeType* data = new CSomeType();
COutboundMsg(COutboundMsg::thSomeType , (void*) data);
将由另一端的用户将 void*
转换回 CSomeType*
(使用类型提示)并删除它。
不喜欢。
我宁愿将 m_OutboundData 包含在 auto_ptr
或其他东西中,并确保它在完成后自行删除。
有什么想法吗?也许完全不同的方法
最佳答案
通常多态性用于这样的系统;任何可以放入出站队列的项目都来自 QueueItem
队列包含 QueueItem*
或指向 QueueItem
的智能指针.
由于这些项目都来自一个共同的基础,您可以安全地删除 QueueItem*
或者允许智能指针来处理它。这种方法还允许您使用 dynamic_cast
确保指针实际上指向您认为的类型的对象。
如果这种方法可行,请务必制作 QueueItem
destructor virtual,否则不会调用派生类的析构函数。
关于c++ - 在智能指针中安全地包含任意数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5512254/