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

Hans Meine meine at informatik.uni-hamburg.de
Mon Jun 2 16:42:50 CEST 2008


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.

-- 
Ciao, /  /
     /--/
    /  / ANS



More information about the Cplusplus-sig mailing list