将std :: unique_ptr插入boost:ptr_map

时间:2017-06-14 20:01:29

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

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

data.getParcelableExtra("data")

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

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

map_ptr API是不是最新的?

基于响应进行编辑,使用unique_ptr的map不是一个很好的选择,因为它需要重写相当数量的代码。我真的想让它与map_ptr一起工作,我正在处理一些旧的代码,我希望做出最小的改动。

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

您可以使用

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

它是C ++ 14的一项功能。不需要旧的增压容器! :)

答案 2 :(得分:0)

  

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<Foo>地图,并按照问题评论中的建议摆脱boost::ptr_map
以下内容应该有效:

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

请注意,如果您想要更接近std::map的工作方式,std::unordered_mapboost::ptr_map更合适,如上所述,其基础数据结构为{{1}而不是std::map