[C++-sig] How to officially wrap a pointer into boost::python::object?

Roman Yakovenko roman.yakovenko at gmail.com
Tue Jun 3 07:07:19 CEST 2008


On Mon, Jun 2, 2008 at 5:42 PM, Hans Meine
<meine at informatik.uni-hamburg.de> wrote:
> Hi!
>
> This seems to be such a simple task:  Given a (e.g factory) function that
> wants to return a new object as boost::python::object, what is the correct
> code?
>
> For instance:
>
> boost::python::object
> myFactory()
> {
>  Foo *result = new Foo();
>  boost::python::object pyresult = ..... result .....; // <- PLEASE FILL IN
>  // e.g. set python attribute on pyresult..
>  return pyresult;
> }
>
> As far as I know, something like this was in the tutorial in the past, but has
> been deleted without being reproduced in any other place I know of.
> What I am doing right now is a little bit clumsy:
>
> boost::python::object pyresult =
>  boost::python::object(
>    boost::python::detail::new_reference( // ugly: private/"detail" API
>      boost::python::manage_new_object::apply<Foo *>::type()(result)));
>
> I have looked at the implementation of manage_new_object to find a nicer
> shortcut, which leads to a is_polymorphic-if branch using
> detail::wrapper_base_::owner or detail::make_owning_holder respectively.
> I refrained from using make_owning_holder directly, not only because it is
> also in the detail namespace, but also because of the second if-branch which
> I completely do not understand.
>
> Also, I would like to not take the detour via an intermediate PyObject * which
> has to be wrapped again; make_owning_holder suggests that using std::auto_ptr
> could be a way, but I am unsure if this works with the special-cased Intel5
> and VC 6 Dinkum library and whether I may leave out the above is_polymorphic
> stuff.
>
> In the end, I would like to know
> a) what is the right way(tm) for common end users,
> b) where this is (prominently) documented, and
> c) what is the perfectly-fine-in-all-cases way for code that should eventually
> go into the BPL.


std::auto_ptr< Foo > result( new Foo() );
boost::python::object pyresult( result );

You will have to add somewhere in your registration code next line:

boost::python::register_ptr_to_python< std::auto_ptr< Foo > >();


-- 
Roman Yakovenko
C++ Python language binding
http://www.language-binding.net/



More information about the Cplusplus-sig mailing list