制作QSharedPointer <void> </void>

时间:2014-05-26 11:46:43

标签: c++ qt boost smart-pointers qsharedpointer

由于历史原因,我在我的软件中使用QSharedPointer<T>。在某些时候,我们希望存储指向相同数据的boost::shared_ptr<T>,并且应该保留QSharedPointer<T>的实例。

执行此操作的常用方法是在boost::shared_ptr<T>的删除器中保留另一个智能指针的副本。但是为了防止删除者针对不同的T使用不同的类型,这会阻止QSharedPointer轻松获得boost::get_deleter,当相应的boost::shared_ptr被提升时,我想要将原始QSharedPointer<T>存储为删除者中的QSharedPointer<void>,而不是使用T

但是我发现QSharedPointer不能胜任这项任务,因为它在编译标题时会抛出“无法完成无效的引用”等错误。

有没有人知道如何在不将T暴露给删除者的情况下完成这项工作?

1 个答案:

答案 0 :(得分:2)

您无法定义QSharedPointer,因为void不是正确的类型。你可以定义QSharedPointer,然后转换为T *和char *,就像这样:

class A {};

QSharedPointer<char> x((char *)new A);
A *ptr = (A *)x.data();

丑陋但它有效。您可能还必须传入一个Deleter,它正确地将类删除到构造函数中,以便正确地破坏您的类。

更好的选择是使用基类。