временно приведите unique_ptr к необработанному указателю - PullRequest
1 голос
/ 03 мая 2020

У меня вопрос по поводу умных указателей. Можно ли временно привести умный указатель к необработанному указателю? Например:

std::vector<std::unique_ptr<monster>> all_monsters до std::vector <monster*> all_monsters ;? Я искал всюду по inte rnet, но не могу найти метод

У меня есть std::vector <monster*> all_monsters, и у меня есть другой вектор с именем std::vector <monster*> monsters, в котором есть объекты, которые должны быть глубоко скопированы в all_monsters. Поэтому я использую это для l oop, чтобы сделать это

  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; и мой для l oop на

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*> в качестве входных данных (которые не могут быть изменены), поэтому я хочу временно привести общий указатель к необработанному указателю. Я думаю, что слишком сложно?

1 Ответ

3 голосов
/ 03 мая 2020

Вы, конечно, можете получить один необработанный указатель из одного 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);
...