Заводы: как передавать временные интеллектуальные указатели на функции. С++
У меня есть класс 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
. Поэтому, если эта функция разрешена, вы должны указать эту ошибку другими способами, например. путем исключения исключения.