将一个unique_ptr临时转换为一个原始指针。

问题描述 投票:0回答:1

我有一个关于智能指针的问题.是否可以将一个智能指针暂时投向一个原始指针呢?例如。

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*> 作为输入(不能改变),这就是为什么我想暂时将共享指针转为原始指针。

c++ pointers vector unique-ptr
1个回答
3
投票

你当然可以从一个单一的原始指针中得到一个单一的 std::unique_ptr,使用 get() 成员函数。

但你不能安全地投出一个 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);
© www.soinside.com 2019 - 2024. All rights reserved.