C++ 临时将唯一的\u ptr强制转换为原始指针

C++ 临时将唯一的\u ptr强制转换为原始指针,c++,pointers,vector,unique-ptr,C++,Pointers,Vector,Unique Ptr,我有一个关于智能指针的问题。 是否可以将智能指针临时强制转换为原始指针? 例如: std::vector all_怪物到std::vector all_怪物;? 我一直在网上到处找,但找不到方法 我有一个std::vector all_monsters,还有另一个叫做std::vector monsters的向量,它的对象应该被深度复制到所有_monsters中。 所以我用这个for循环来实现 for (unsigned i=0; i < monsters.size(); i++)

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

std::vector all_怪物到std::vector all_怪物;? 我一直在网上到处找,但找不到方法

我有一个std::vector all_monsters,还有另一个叫做std::vector monsters的向量,它的对象应该被深度复制到所有_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::矢量所有_怪物; 和我的循环

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作为不能更改的输入,这就是为什么我想临时将共享指针转换为原始指针。
我想的太复杂了吗?

您当然可以使用member函数从单个std::unique\u ptr获得单个原始指针

但是您不能安全地将一种类型的std::vector强制转换为另一种类型的std::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);

您当然可以使用member函数从单个std::unique_ptr获取单个原始指针

但是您不能安全地将一种类型的std::vector强制转换为另一种类型的std::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中的-。错误:conversion candidate of type'monster***const std::unique_ptr&'真的不知道why@momonosuke有一个额外的星号,试试最新的版本。不,如果另一个函数引用向量并更改其顺序或大小,则不会影响tmp_怪物的顺序或大小。这将是非常讨厌的工作。但是如果它所做的只是洗牌向量,也许可以看看std::shuffle。我得到了错误“conversion candidate of type”monster*const std::unique_ptr`哎呀,我错过了lambda中的-。错误:conversion candidate of type'monster***const std::unique_ptr&'真的不知道why@momonosuke还有一个额外的星号,试试最新的版本。不,如果另一个函数引用向量并更改其顺序或大小,则不会影响tmp_怪物的顺序或大小。这将是非常讨厌的工作。但是如果它所做的只是洗牌向量,那么可以看看std::shuffle。