c++ - 在智能指针中安全地包含任意数据

标签 c++ containers smart-pointers

首先:我搜索了一半的网络以找到 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/

相关文章:

html - 如何在容器中居中放置两个 float 元素?

python - Python 的 'in' 列表运算符是否具有成功搜索的早期输出

c++ - 在VScode中进行调试时,如何在Docker容器中找到源代码文件夹

c++ - 引用 unique_ptr 的 vector

c++ - unique_ptr 可以在不泄漏内存的情况下与负索引一起使用吗?

c++ - 如何使用cerial序列化

c++ - CString 用于静态方法

c++ - 您可以使用不带::的命名空间从其他类引用函数吗?

c++ - 如何捕获将在 C++ 中发送到标准输出的数据?

c++ - 如何初始化作为类成员的智能指针?