临时将 unique_ptr 强制转换为原始指针
Posted
技术标签:
【中文标题】临时将 unique_ptr 强制转换为原始指针【英文标题】:temporarily cast a unique_ptr to a raw pointer 【发布时间】:2020-05-02 22:40:41 【问题描述】:我有一个关于智能指针的问题。 是否可以将智能指针临时转换为原始指针? 例如:
std::vector<std::unique_ptr<monster>> all_monsters
到 std::vector <monster*> all_monsters
;?
我一直在互联网上到处寻找,但找不到方法
我有一个std::vector <monster*> all_monsters
和另一个名为std::vector <monster*> monsters
的向量,其中包含应该深度复制到 all_monsters 中的对象。
所以我使用这个for循环来这样做
for (unsigned i=0; i < monsters.size(); i++)
all_monsters.push_back(new monster(monsters[i]->getMonster(),monsters[i]->getCost(),monsters[i]->getType()));
但是我不想手动删除对象,所以我想使用唯一指针。
这就是为什么我将矢量更改为
std::vector<std::unique_ptr<monster>> all_monsters;
和我的 for 循环到
for(unsigned i = 0; i < monsters.size(); i++)
all_monsters.push_back(std::make_unique<monster>(all_monsters[i]->getName(),all_monsters[i]->getManaCost(),all_monsters[i]->getType()));
但我有一个函数只将std::vector <monster*>
作为输入(无法更改),这就是为什么我想暂时将共享指针转换为原始指针的原因。
我是不是想得太复杂了?
【问题讨论】:
【参考方案1】:您当然可以使用get()
成员函数从单个std::unique_ptr
获取单个原始指针。
但您不能安全地将一种类型的 std::vector
转换为另一种类型的 std::vector
。
因此,如果无法更改其他函数的接口,不幸的是,您需要额外的步骤来构建其vector
参数:
std::vector<monster*> tmp_monsters;
std::transform(all_monsters.begin(), all_monsters.end(),
back_inserter(tmp_monsters),
[](const std::unique_ptr<monster>& mon_in) return mon_in.get(); );
other_function(tmp_monsters);
【讨论】:
我得到错误 `conversion Candidate of type 'monster *()(const std::unique_ptr&
。
错误:conversion candidate of type 'monster **(*)(const std::unique_ptr<monster *> &)'
真的不知道为什么
@momonosuke 多了一个星号,试试最新版本。
哦。不,如果其他函数通过引用获取向量并更改其顺序或大小,则不会影响tmp_monsters
的顺序或大小。这将是非常讨厌的工作。 (但如果它所做的只是洗牌向量,也许看看std::shuffle
。)以上是关于临时将 unique_ptr 强制转换为原始指针的主要内容,如果未能解决你的问题,请参考以下文章
使用带有自定义释放器的 std::unique_ptr 来包装原始指针