Ugh, этот API является уродливым.
я буду считать, что функция обещает указатель она «возвращает» владеет ресурсом, который должен быть удален вызывающим в способе, которым smart_ptr
делает так, и что smart_ptr
может быть инициализирована с произвольным указателя. Это невозможно сделать иначе.
Вы можете просто захватить указатель так же, как и в случае отсутствия умных указателей, а затем поместить его в умный указатель.
T* ptr;
Foo(ptr);
smart_ptr<T> val(ptr);
Это может быть так, что умный указатель уже владеет что-то и вы хотите передать что-то функции, а затем заменить то, что является владельцем смарт-указатель. Это ... даже уродливее.
Я не знаю, будет ли функция владеть ресурсом, в который вы проходите (обычно, я бы этого не ожидал, но поскольку API является уродливым, я не буду к нему ругаться). Это приводит к двум различным сценариям.
Если функция принимает владение ресурса вы проходите, то есть, он заботится об удалении самого указателя, смарт-указателе типа должен быть один, который может отказаться от права собственности на ресурсе, как std::unique_ptr
с функцией release()
члена. Примечательно, что std::shared_ptr
не может этого сделать (считайте, что другие shared_ptr
s также могут владеть им).
Таким образом, если предположить, что интеллектуальный указатель имеет такую возможность, и способность быть реинициализирован к произвольному указателя (например, с std::unique_ptr::reset
), вы можете сделать следующее:
//smart_ptr<T> val;
T* ptr = val.release();
Foo(ptr);
val.reset(ptr);
Если функция не брать на себя ответственность ресурса, все, что требуется, - это возможность повторной инициализации с помощью произвольного указателя.
//smart_ptr<T> val;
T* ptr = val.get();
Foo(ptr);
val.reset(ptr);
Возможно, вы имели в виду: 'shared_ptr'? – avakar