我正在将一些旧代码移动到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一起工作,我正在处理一些旧的代码,我希望做出最小的改动。
答案 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是不是最新的?
不,你只是以错误的方式使用它。
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_map
比boost::ptr_map
更合适,如上所述,其基础数据结构为{{1}而不是std::map
。