具有不完整类型的非共享智能指针

edA*_*a-y 8 c++ boost shared-ptr unique-ptr c++11

是否有一个标准指针类(或Boost),它是一个非共享指针,适用于不完整类型?我已经浏览了C++ 11标准和boost库,但找不到它,虽然它看起来像一个非常有用的类型.

例如,我希望能够使用智能指针创建不透明类型.

  class A;
  wrap_ptr<A> some_func();
  void other_func( A const & );
Run Code Online (Sandbox Code Playgroud)

A是一种不透明的类型,可用于各种功能.上述接口的用户只有一个不完整的A定义,但应该能够删除/重置指针.我知道上面的内容可以用a来完成,shared_ptr但是在这个特定的代码中我不需要开销.unique_ptr具有正确的所有权语义,但不能使用不完整的类型.理论上,包装器应该只需要指向删除器的开销.

在C++ 11或boost库中是否有这样的类型?

注意:我知道我可以很容易地构建这种类型,但如果可能的话我更喜欢标准类型.它似乎应该是一个基本的智能指针类型.


更新:unique_ptr似乎不是一个好的选择.首先,语法开销会抵消.其次,我不相信它可以安全地与自定义删除器一起使用.我会检查它是如何工作的.

Kla*_*aim 9

要清楚unique_ptr:它确实适用于不完整类型,但如果你在类的标题中使用它:

#include <memory>

class A;

class B
{

std::unique_ptr<A> m_a;

};
Run Code Online (Sandbox Code Playgroud)

由于缺少删除器实现,它不会链接.有一个简单的解决方法:只需在cpp中定义主机类的de析构函数,即使它是空的或应该是默认的!

// B.hpp
#include <memory>

class A;

class B
{
public:

    B();
    ~B();

private:

std::unique_ptr<A> m_a;

};

// B.cpp

B::B(){} // or =default; (if you have a compiler providing it)
B::~B(){} // or =default; (if you have a compiler providing it)
Run Code Online (Sandbox Code Playgroud)

另外,在那里阅读我的问题的答案:std :: unique_ptr <T>是否需要知道T的完整定义?

也许可以看一下Herb Sutter如何推荐pimpl成语(暗示unique_ptr中的不完整类型):http://herbsutter.com/gotw/_100/


Mat*_* M. 5

实际上,unique_ptr只要指定自定义删除器,就可以处理不完整的类型。

然而,与 相反shared_ptr,这实际上会影响其类型,因为自定义删除器是静态精确的(作为第二个模板参数)。