【问题标题】:Making a QSharedPointer<void>制作 QSharedPointer<void>
【发布时间】:2014-05-26 11:46:43
【问题描述】:

由于历史原因,我在我的软件中使用QSharedPointer&lt;T&gt;。在某些时候,我们希望将指向相同数据的boost::shared_ptr&lt;T&gt; 存储起来,并且应该使QSharedPointer&lt;T&gt; 的实例保持活动状态。

执行此操作的常用方法是在boost::shared_ptr&lt;T&gt; 的删除器中保留另一个智能指针的副本。但是为了防止删除器对不同的Ts 有不同的类型,这将防止在对应的boost::shared_ptr 被向上转换时轻松获得QSharedPointerboost::get_deleter,我想存储原始的QSharedPointer&lt;T&gt;作为删除器中的QSharedPointer&lt;void&gt;,而不是使用T

但我发现QSharedPointer 不能胜任这项任务,因为它在编译其标头时会抛出诸如“无法完成对 void 的引用”之类的错误。

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

【问题讨论】:

  • 您能否澄清一下:At some points, we want to store boost::shared_ptr&lt;T&gt; that point to the same data?您的意思是您希望拥有多个所有权?
  • 只是QSharedPointer&lt;void&gt; 的想法听起来是错误的。它有什么用?看起来您需要 QVariant。
  • FWIW unique_ptr&lt;void&gt; 对于 RAII 句柄非常方便
  • 在我看来,唯一的办法就是让所有Ts拥有共同的祖先。
  • @sehe 那么,你想在删除器中做点什么吗? unique_ptr&lt;void&gt; 有什么用处?您刚刚写下了问题中的内容。

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


【解决方案1】:

您无法定义 QSharedPointer,因为 void 不是正确的类型。您可以定义 QSharedPointer,然后在 T * 和 char * 之间进行转换,如下所示:

class A {};

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

丑陋但有效。您可能还必须将正确删除类的 Deleter 传递给构造函数,以便正确销毁您的类。

更好的选择是使用基类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 2012-09-19
    • 2017-06-09
    • 2016-11-06
    相关资源
    最近更新 更多