我对智能指针有疑问。 是否可以将智能指针临时转换为原始指针? 例如:
std::vector<std::unique_ptr<monster>> all_monsters
至std::vector <monster*> all_monsters
;?
我一直在互联网上到处寻找,但找不到方法
我有一个std::vector <monster*> all_monsters
,我还有另一个称为std::vector <monster*> monsters
的向量,该向量具有应深层复制到all_monster中的对象。
所以我用这个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*>
作为输入(不能更改)的函数,这就是为什么我想将共享指针临时转换为原始指针的原因。
我觉得太复杂了吗?
答案 0 :(得分:3)
您当然可以使用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);