Заводы: как передавать временные интеллектуальные указатели на функции. С++

У меня есть класс Foo

class Foo;

фабрика возвращает указатель на нее:

std::unique_ptr<Foo> createFoo(); 

и, поскольку мне сказал Херб, что простая функция без особых претензий на всю жизнь Foo должна иметь простые голые указатели:

void plainf(Foo* f);

Как мой клиент должен правильно это сделать?

plainF(createFoo());

Он не был бы рад, если бы ему пришлось написать:

auto someName = createFoo();
plainF(someName.get()); 

Ответы

Ответ 1

Вы можете использовать функцию get member, которая возвращает необработанный указатель на принадлежащий ему объект.

plainF(createFoo().get());

Временное созданное createFoo() не выйдет за пределы области действия до plainF пор, пока не закончится plainF. Пока plainF не передает указатель вверх, он полностью безопасен.

Ответ 2

Если вам не нужен аргумент, чтобы plainF был plainF, вы также можете изменить его подпись, чтобы принять аргумент по ссылке, что позволяет немного меньше подробного синтаксиса:

std::unique_ptr<Foo> createFoo(); 
void plainf(Foo& f);

plainF(*createFoo());

Все ответы на всю жизнь, упомянутые в ответе NathanOliver, применимы, поэтому это безопасно использовать.

Обратите внимание, что это означает, что createFoo никогда не вернет пустой unique_ptr. Поэтому, если эта функция разрешена, вы должны указать эту ошибку другими способами, например. путем исключения исключения.