【问题标题】:Insert std::unique_ptr into boost:ptr_map将 std::unique_ptr 插入 boost:ptr_map
【发布时间】:2017-06-14 20:01:29
【问题描述】:

我正在将一些旧代码移至 c++14,它使用了已弃用的 auto_ptr,并且与 boost:ptr_map 配合得很好,你可以这样做:

auto_ptr<Foo> foo(new Foo);
boost:map_ptr<int, Foo> m;
m.insert(5, foo);

现在,将 auto_ptr 替换为 unique_ptr,它不会编译:

unique_ptr<Foo> foo(new Foo);
boost:map_ptr<int, Foo> m;
m.insert(5, foo);            // Does not compile
m.insert(5, move(foo));      // Does not compile either,
                             // this should be the right thing to do
m.insert(5, move.release()); // Does compile, but isn't exception safe

map_ptr API 还不是最新的吗?

根据响应进行编辑,在我的情况下,使用 unique_ptr 的映射不是一个好选择,因为它需要重写大量代码。我真的很想让它与 map_ptr 一起工作,我正在处理一些旧代码,我希望做出最少的更改。

【问题讨论】:

  • 什么是 boost ptr_map?您确定在 C++14 中仍然需要它吗?我不认为你这样做,那些旧的指针容器是为了解决 auto_ptr 实际上不能由容器一般处理的事实。
  • 为什么不直接使用std::map&lt;int, std::unique_ptr&lt;Foo&gt;&gt;

标签: c++ c++11 boost c++14


【解决方案1】:

我认为在 C++14 中你想要的是这样的:

std::unordered_map<int, std::unique_ptr<Foo>> x;
x.emplace(5, std::make_unique<Foo>());

您不再需要那些旧的 bo​​ost _ptr 容器,它们基本上是缺少可以在容器中安全处理的拥有、零开销指针的解决方法(即unique_ptr)。

【讨论】:

    【解决方案2】:

    你可以使用

    std::unordered_map<int, std::unique_ptr<Foo>> x;
    x.emplace(5, std::make_unique<Foo>());
    

    它是一个 C++14 特性。不需要旧的升压容器!!! :)

    【讨论】:

    • 好点,我应该提到这对我来说不是一个选择,因为这不是 ptr_map 的替代品,就像 unique_ptr 主要是我拥有的特定代码的 auto_ptr 一样。而且我不得不说,与 unique_ptr 的地图相比,ptr_map 的使用要好一些。
    【解决方案3】:

    map_ptr API 还不是最新的吗?

    不,你只是用错了方法。

    来自documentation

    ptr_map 是一个指针容器,它使用底层的 std::map 来存储指针。

    请注意,这不会编译:

    unique_ptr<Foo> foo(new Foo);
    void *ptr = foo;
    

    因为您无法通过赋值将std::unique_ptr 转换为void *,所以没有多大意义。
    当您尝试这样做时,内部或多或少会发生这种情况:

    m.insert(5, move(foo));
    

    另一方面,这是编译:

    unique_ptr<Foo> foo(new Foo);
    Foo *bar = foo.realease();
    void *ptr = bar;
    

    这很接近:

    m.insert(5, move.release());
    

    因此,您不能指望第一种情况有效,而实际上却没有。


    话虽如此,现在我宁愿使用标准模板库中的 int 和 std::unique_ptr&lt;Foo&gt; 的映射,并摆脱 boost::ptr_map,正如问题的 cmets 中所建议的那样。
    像下面这样的东西应该可以工作:

    std::map<int, std::unique_ptr<Foo>>
    

    注意std::mapstd::unordered_map 更合适,如果您想要更接近boost::ptr_map 的工作原理,如上所述,它的基础数据结构是std::map 而不是std::unordered_map

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-27
      • 2019-11-07
      • 2020-04-17
      • 1970-01-01
      • 2019-08-19
      • 1970-01-01
      相关资源
      最近更新 更多