繁体   English   中英

临时将 unique_ptr 强制转换为原始指针

[英]temporarily cast a unique_ptr to a raw pointer

我有一个关于智能指针的问题。 是否可以将智能指针临时转换为原始指针? 例如:

std::vector<std::unique_ptr<monster>> all_monstersstd::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()));

}

但我有一个 function 仅将std::vector <monster*>作为输入(无法更改),这就是为什么我想暂时将共享指针转换为原始指针的原因。 我是不是想的太复杂了?

您当然可以使用get()成员 function 从单个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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM