• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1[section boost/python/copy_non_const_reference.hpp]
2[section Class `copy_non_const_reference`]
3`copy_non_const_reference` is a model of [link concepts.resultconverter.resultconvertergenerator_concept ResultConverterGenerator] which can be used to wrap C++ functions returning a reference-to-non-const type such that the referenced value is copied into a new Python object.
4``
5namespace boost { namespace python
6{
7    struct copy_non_const_reference
8    {
9        template <class T> struct apply;
10    };
11}}
12``
13[endsect]
14[section Class `copy_non_const_reference` metafunctions]
15``template <class T> struct apply``
16[variablelist
17[[Requires][`T` is `U &` for some non-const `U`.]]
18[[Returns][`typedef to_python_value<T> type`;]]
19]
20[endsect]
21[section Example]
22C++ module definition:
23``
24#include <boost/python/module.hpp>
25#include <boost/python/class.hpp>
26#include <boost/python/copy_non_const_reference.hpp>
27#include <boost/python/return_value_policy.hpp>
28
29// classes to wrap
30struct Bar { int x; }
31
32struct Foo {
33   Foo(int x) : { b.x = x; }
34   Bar& get_bar() { return b; }
35 private:
36   Bar b;
37};
38
39// Wrapper code
40using namespace boost::python;
41BOOST_PYTHON_MODULE(my_module)
42{
43    class_<Bar>("Bar");
44
45     class_<Foo>("Foo", init<int>())
46        .def("get_bar", &Foo::get_bar
47            , return_value_policy<copy_non_const_reference>())
48       ;
49}
50``
51Python code:
52``
53>>> from my_module import *
54>>> f = Foo(3)         # create a Foo object
55>>> b = f.get_bar()    # make a copy of the internal Bar object
56``
57[endsect]
58[endsect]
59