[C++-sig] Exporting references into python

David Abrahams dave at boost-consulting.com
Sun Mar 2 22:06:55 CET 2003


Nicholas Francis <nich at users.sourceforge.net> writes:

> A newbie question regarding boost::python.
>
> I need to make a templatized function that returns a
> boost::python::object containing a reference to an object I already
> have. Basically:
>
> template<class T>
> object convertToPython (T &obj) {
> 	return object (obj)
> }
>
> All classes I pass through T are already wrapped (they are also not
> copy-constructible). I tried with the code found at python.orgs wiki:
>
> template<class T> T& identity(T& x) { return x; }
> template<class T> object get_object_reference (T& x) {
> 	object f = make_function
> 		(&identity<T>, return_value_policy<reference_existing_object());
> 	return f(x);
> }
>
> this code gave me a compile error (on CW 8.3, Mac OS X). Apparently CW
> is convinced that the &identity<T> maps to void.

Compiler bug.  It confounds VC6 and VC7 also.  The following works
perfectly with cwpro8.3 and the others however:

    #include <boost/python.hpp>

    using namespace boost::python;

    template<class T>
    struct identity
    {
        static T& execute(T& x) { return x; }
    };

    template<class T> object get_object_reference (T& x)
    {
        object f = make_function
            (&identity<T>::execute, return_value_policy<reference_existing_object>());
        return f(x);
    }

    struct InputManager {};
    InputManager x;

    object get_in_mgr()
    {
        return get_object_reference(x);
    }

    BOOST_PYTHON_MODULE_INIT(test_ext)
    {
        class_<InputManager>("InputManager");
        def("get_in_mgr", get_in_mgr);
    }

Maybe you could update the Wiki?

> I then tried to hardcode a type just to see if it worked at all:
>
> InputManager &identity (InputManager &x) { return x; }
> object get_object_reference (InputManager &x) {
> 	object f = make_function (
> 		&identity, return_value_policy<reference_existing_object());
> 	return f(x);
> }
>
> This compiled, but gave me a typeerror at runtime: (No to_python
> (by-value) converter found for c++ type: InputManager)

Are you sure you know which Python code was causing that?


-- 
Dave Abrahams
Boost Consulting
www.boost-consulting.com





More information about the Cplusplus-sig mailing list