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似乎不是一个好的选择.首先,语法开销会抵消.其次,我不相信它可以安全地与自定义删除器一起使用.我会检查它是如何工作的.
要清楚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/
实际上,unique_ptr只要指定自定义删除器,就可以处理不完整的类型。
然而,与 相反shared_ptr,这实际上会影响其类型,因为自定义删除器是静态精确的(作为第二个模板参数)。
| 归档时间: |
|
| 查看次数: |
2738 次 |
| 最近记录: |