У меня есть что-то вроде shared_ptr<Type> t(makeSomething(), mem_fun(&Type::deleteMe))
Теперь мне нужно вызвать функцию стиля C, для которой требуется указатель на Type. Как получить его из shared_ptr?
Получение нормального ptr из shared_ptr?
Ответ 1
Используйте метод get():
boost::shared_ptr<foo> foo_ptr(new foo());
foo *raw_foo = foo_ptr.get();
c_library_function(raw_foo);
Убедитесь, что ваш shared_ptr не выходит из области действия до того, как функция библиотеки будет выполнена с ним, иначе может возникнуть плохое поведение, поскольку библиотека может попытаться что-то сделать с указателем после его удаления. Будьте особенно осторожны, если функция библиотеки сохраняет копию необработанного указателя после его возврата.
Ответ 2
Другой способ сделать это - использовать комбинацию операторов & и *:
boost::shared_ptr<foo> foo_ptr(new foo());
c_library_function( &*foo_ptr);
В то время как лично я предпочел бы использовать метод get() (это действительно правильный ответ), одно из преимуществ этого заключается в том, что его можно использовать с другими классами, которые перегружают operator* (разыменование указателя), но делают не предоставлять метод get(). Может быть полезно в шаблоне универсального класса, например.