[英]unique_ptr boost equivalent?
在boost库中是否有一些与C ++ 1x的std :: unique_ptr等效的类? 我正在寻找的行为是能够拥有异常安全的工厂功能,就像这样......
std::unique_ptr<Base> create_base()
{
return std::unique_ptr<Base>(new Derived);
}
void some_other_function()
{
std::unique_ptr<Base> b = create_base();
// Do some stuff with b that may or may not throw an exception...
// Now b is destructed automagically.
}
编辑:现在,我正在使用这个黑客,这似乎是我能在这一点上得到的最好的......
Base* create_base()
{
return new Derived;
}
void some_other_function()
{
boost::scoped_ptr<Base> b = create_base();
// Do some stuff with b that may or may not throw an exception...
// Now b is deleted automagically.
}
在没有C ++ 0x的情况下创建类似unique_ptr
东西是不可能的(它是标准库的一部分,因此Boost不需要提供它)。
特别是没有rvalue引用(这是C ++ 0x中的一个特性),无论是否有Boost,都不可能实现unique_ptr
的强大实现。
在C ++ 03中,有一些可能的替代方案,尽管每个都有它们的缺陷。
boost::shared_ptr
可能是功能方面最简单的替代品。 你可以安全地在任何你使用unique_ptr
地方使用它,它可以工作。 由于添加了引用计数,它不会那么高效。 但是如果你正在寻找一个能够处理unique_ptr
可以做的所有事情的简单替代品,这可能是你最好的选择。 (当然, shared_ptr
也可以做得更多,但它也可以简单地用作unique_ptr
替代品。) boost::scoped_ptr
类似于unique_ptr
但不允许转让所有权。 只要智能指针在其整个生命周期中保留独占所有权,它就能很好地工作。 std::auto_ptr
与unique_ptr
非常相似,但有一些限制,主要是它不能存储在标准库容器中。 如果您只是寻找一个允许转让所有权的指针,但这并不意味着存储在容器中或复制,这可能是一个不错的选择。 从Boost 1.57开始, Boost.Move库中有一个官方的unique_ptr
实现。
从文档 :
(...)std :: unique_ptr的替代品,也可以从C ++ 03编译器中使用。
该代码在<boost/move/unique_ptr.hpp>
头文件中可用,并且位于boost::movelib
命名空间中。 此外,Boost.Move库在<boost/move/make_unique.hpp>
提供了make_unique()
工厂函数,也在boost::movelib
命名空间中。
因此,问题的例子可以这样实现:
#include <boost/move/unique_ptr.hpp>
using boost::movelib::unique_ptr;
unique_ptr<Base> create_base()
{
return unique_ptr<Base>(new Derived);
}
查看Wandbox上的实例 。 请注意,代码在C ++ 98模式(!)中使用gcc 4.6.4编译得很好。
boost::movelib::unique_ptr
在应用于具有基类/派生类的情况时有什么boost::movelib::unique_ptr
,该实现提供了对基类中虚拟析构函数声明的编译时检查。 如果您碰巧省略它,代码将无法编译 (单击“运行(...)”按钮以查看编译器错误消息)。
一个小问题是包括来自boost/move
目录,但代码存在于boost::movelib
命名空间中(细微差别,但可能很烦人)。
有关更多详细信息,另请参阅boost邮件列表中的线程 。
感谢IonGaztañaga这个绝对独特且有用的代码。
你可能想尝试一下Howard Hinnant的'概念证明' unique_ptr<>
C ++ 03的实现(免责声明 - 我没有):
他的一个例子是返回unique_ptr<int>
:
unique_ptr<int> factory(int i)
{
return unique_ptr<int>(new int(i));
}
进程间库中的unique_ptr
怎么样?
我用过Howard Hinnant的unique_ptr 。 如果你不擅长从编译器中读取疯狂的元编程错误,你可能想要明确指出。 然而,在90%的情况下它确实像unique_ptr一样。
否则我建议将paramters作为boost::scoped_ptr&
和内部交换来窃取所有权。 要获取unique_ptr样式返回值,请使用auto_ptr
。 捕获shared_ptr
或scoped_ptr
的auto_ptr
返回值以避免直接使用auto_ptr
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.