【问题标题】:temporarily cast a unique_ptr to a raw pointer临时将 unique_ptr 强制转换为原始指针
【发布时间】: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; 作为输入(无法更改),这就是为什么我想暂时将共享指针转换为原始指针的原因。 我是不是想得太复杂了?

【问题讨论】:

    标签: c++ pointers vector unique-ptr


    【解决方案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。)
    猜你喜欢
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 1970-01-01
    相关资源
    最近更新 更多