[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