1 [section boost/python/reference_existing_object.hpp]
2 [section Class `reference_existing_object`]
3 `reference_existing_object` is a model of [link concepts.resultconverter.resultconvertergenerator_concept ResultConverterGenerator] which can be used to wrap C++ functions which return a reference or pointer to a C++ object. When the wrapped function is called, the value referenced by its return value is not copied. A new Python object is created which contains a pointer to the referent, and no attempt is made to ensure that the lifetime of the referent is at least as long as that of the corresponding Python object. Thus, it can be *highly dangerous* to use `reference_existing_object` without additional lifetime management from such models of [link concepts.callpolicies CallPolicies] as [link function_invocation_and_creation.models_of_callpolicies.boost_python_with_custodian_and_.class_with_custodian_and_ward `with_custodian_and_ward`]. This class is used in the implementation of [link function_invocation_and_creation.models_of_callpolicies.boost_python_return_internal_ref.class_template_return_internal_r `return_internal_reference`].
5 namespace boost { namespace python
7 struct reference_existing_object
9 template <class T> struct apply;
14 [section Class `reference_existing_object` metafunctions]
15 ``template <class T> struct apply``
17 [[Requires][`T` is `U&` or `U*` for some `U`.]]
18 [[Returns][`typedef to_python_indirect<T, V> type;`, where V is a class whose static execute function constructs an instance holder containing an unowned `U*` pointing to the referent of the wrapped function's return value.]]
24 #include <boost/python/module.hpp>
25 #include <boost/python/class.hpp>
26 #include <boost/python/reference_existing_object.hpp>
27 #include <boost/python/return_value_policy.hpp>
35 int exchange(int n) // set x and return the old value
46 static Singleton just_one;
51 using namespace boost::python;
52 BOOST_PYTHON_MODULE(singleton)
55 return_value_policy<reference_existing_object>());
57 class_<Singleton>("Singleton")
58 .def("exchange", &Singleton::exchange)
65 >>> s1 = singleton.get_it()
66 >>> s2 = singleton.get_it()
67 >>> id(s1) == id(s2) # s1 and s2 are not the same object
69 >>> s1.exchange(42) # but they reference the same C++ Singleton