1[section boost/python/return_opaque_pointer.hpp] 2[section Class `return_opaqe_pointer`] 3return_opaque_pointer is a model of [link concepts.resultconverter.resultconvertergenerator_concept ResultConverterGenerator] which can be used to wrap C++ functions returning pointers to undefined types such that the return value is copied into a new Python object. 4 5In addition to specifying the `return_opaque_pointer` policy the [link to_from_python_type_conversion.boost_python_opaque_pointer_conv.macro_boost_python_opaque_specia `BOOST_PYTHON_OPAQUE_SPECIALIZED_TYPE_ID`] macro must be used to define specializations for the [link utility_and_infrastructure.boost_python_type_id_hpp.functions `type_id`] function on the type pointed to by returned pointer. 6`` 7namespace boost { namespace python 8{ 9 struct return_opaque_pointer 10 { 11 template <class R> struct apply; 12 }; 13}} 14`` 15[endsect] 16[section Class `return_opaque_pointer` metafunctions] 17``template <class T> struct apply`` 18[variablelist 19[[Returns][`detail::opaque_conversion_holder<R> type;`]] 20] 21[endsect] 22[section Example] 23In C++: 24`` 25# include <boost/python/return_opaque_pointer.hpp> 26# include <boost/python/def.hpp> 27# include <boost/python/module.hpp> 28# include <boost/python/return_value_policy.hpp> 29 30typedef struct opaque_ *opaque; 31 32opaque the_op = ((opaque) 0x47110815); 33 34opaque get () { return the_op; } 35void use (opaque op) { 36 if (op != the_op) 37 throw std::runtime_error (std::string ("failed")); 38} 39 40void failuse (opaque op) { 41 if (op == the_op) 42 throw std::runtime_error (std::string ("success")); 43} 44 45BOOST_PYTHON_OPAQUE_SPECIALIZED_TYPE_ID(opaque_) 46 47namespace bpl = boost::python; 48 49BOOST_PYTHON_MODULE(opaque_ext) 50{ 51 bpl::def ( 52 "get", &::get, bpl::return_value_policy<bpl::return_opaque_pointer>()); 53 bpl::def ("use", &::use); 54 bpl::def ("failuse", &::failuse); 55} 56`` 57Python code: 58`` 59""" 60>>> from opaque_ext import * 61>>> # 62>>> # Check for correct conversion 63>>> use(get()) 64>>> failuse(get()) 65Traceback (most recent call last): 66 ... 67RuntimeError: success 68>>> # 69>>> # Check that there is no conversion from integers ... 70>>> use(0) 71Traceback (most recent call last): 72 ... 73TypeError: bad argument type for built-in operation 74>>> # 75>>> # ... and from strings to opaque objects 76>>> use("") 77Traceback (most recent call last): 78 ... 79TypeError: bad argument type for built-in operation 80""" 81def run(args = None): 82 import sys 83 import doctest 84 85 if args is not None: 86 sys.argv = args 87 return doctest.testmod(sys.modules.get(__name__)) 88 89if __name__ == '__main__': 90 print "running..." 91 import sys 92 sys.exit(run()[0]) 93`` 94[endsect] 95[endsect] 96