Class return_addressof is a model of ResultConverterGenerator which can be used to wrap C++ functions returning any pointer, such that the pointer value is converted to unsigned int and it is copied into a new Python object.

This call policy was created to be used with ctypes package and provide access to some raw\low level data, without creating wrappers.

Pay attention: you have to manage the memory by your own.


int* get_value(){
    static int buffer[] = { 0,1,2,3,4 };
    return buffer;

namespace bpl = boost::python;
  def( "get_value"
       , bpl::return_value_policy< pyplusplus::call_policies::return_addressof<> >() );

The Py++ code is not that different from what you already know:

from pyplusplus import module_builder
from pyplusplus.module_builder import call_policies

mb = module_builder.module_builder_t( ... )
mb.free_function( return_type='float *' ).call_policies \
    = call_policies.return_value_policy( call_policies.return_addressof )

Python code:

import ctypes
import my_module

buffer_type = ctypes.c_int * 5
buffer = buffer_type.from_address( my_module.get_value() )
assert [0,1,2,3,4] == list( buffer )