临时将 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_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&lt;std::unique_ptr&lt;monster&gt;&gt; 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 &lt;monster*&gt; 作为输入(无法更改),这就是为什么我想暂时将共享指针转换为原始指针的原因。 我是不是想得太复杂了?

【问题讨论】:

【参考方案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` 哎呀,我错过了 lambda 中的 &amp; 错误:conversion candidate of type 'monster **(*)(const std::unique_ptr&lt;monster *&gt; &amp;)' 真的不知道为什么 @momonosuke 多了一个星号,试试最新版本。 哦。不,如果其他函数通过引用获取向量并更改其顺序或大小,则不会影响tmp_monsters 的顺序或大小。这将是非常讨厌的工作。 (但如果它所做的只是洗牌向量,也许看看std::shuffle。)

以上是关于临时将 unique_ptr 强制转换为原始指针的主要内容,如果未能解决你的问题,请参考以下文章

使用带有自定义释放器的 std::unique_ptr 来包装原始指针

unique_ptr 比原始指针快吗? C++ [关闭]

unique_ptr 中原始指针的默认删除器

C++ 中指向 unique_ptr 函数参数的原始指针的目的是啥?

父子类上下强制转换访问权限问题

将间接指针强制转换为 Objective-C 指针