繁体   English   中英

unique_ptr提升等价?

[英]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_ptrunique_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_ptrscoped_ptrauto_ptr返回值以避免直接使用auto_ptr

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM