Re: [C++-sig] Raw member and constructor functions
Thanks a lot for this fast answer ! This looks like the way to go. The following code does compile but the result under python is unexpected : #include <boost/python.hpp> #include <boost/python/raw_function.hpp> using namespace boost::python; namespace { class X { public: object memberraw(const tuple& args, const dict& kw) { return make_tuple(args, kw); } }; object memberrawfwd(tuple raw, dict kw) { tuple arg = extract<tuple&>(raw.slice(1, _))(); return extract<X&>(raw[0])(). memberraw(arg, kw); } }; BOOST_PYTHON_MODULE(PythonTest) { class_<X>("X") .def("memberraw", raw_function(memberrawfwd)) ; } However the following results when run with Python :
a = X() a.memberraw() Traceback (most recent call last): File "<stdin>", line 1, in ? TypeError: No registered converter was able to extract a C++ reference to type c lass boost::python::tuple from this Python object of type tuple
Any further help ? Thanks in advance, Marc -----Original Message----- From: c++-sig-bounces@python.org [mailto:c++-sig-bounces@python.org] On Behalf Of David Abrahams Sent: lundi 6 juin 2005 04:31 To: c++-sig@python.org Subject: Re: [C++-sig] Raw member and constructor functions "Studious Apprentice" <apprentice_99@hotmail.com> writes:
Hello !
I would like to use raw member functions and a raw constructor. However I can only manage to have raw functions to work.
The following code works :
#include <boost/python.hpp> #include <boost/python/raw_function.hpp> using namespace boost::python;
tuple raw(tuple args, dict kw) { return make_tuple(args, kw); }
BOOST_PYTHON_MODULE(PythonTest) { def("raw", raw_function(raw)); }
However this code does not compile with MSVC7.1 and results in "error C2064: term does not evaluate to a function taking 2 arguments" :
#include <boost/python.hpp> #include <boost/python/raw_function.hpp> using namespace boost::python;
class X { public: object memberraw(tuple args, dict kw) { return object(); } };
BOOST_PYTHON_MODULE(PythonTest) { class_<X>("X") .def("memberraw", raw_function(&X::memberraw)) ; }
As http://www.boost.org/libs/python/doc/v2/raw_function.html says, f(tuple(), dict()) must be well-formed where f is the argument to raw_function. That's clearly not the case here. This might work: tuple raw(tuple raw, dict kw) { extract<X&>(raw[0])().memberraw(raw.slice(1), kw); } BOOST_PYTHON_MODULE(PythonTest) { class_<X>("X") .def("memberraw", raw_function(raw)) ; } -- Dave Abrahams Boost Consulting www.boost-consulting.com _______________________________________________ C++-sig mailing list C++-sig@python.org http://mail.python.org/mailman/listinfo/c++-sig
"Studious Apprentice" <apprentice_99@hotmail.com> writes:
Thanks a lot for this fast answer ! This looks like the way to go. The following code does compile but the result under python is unexpected :
#include <boost/python.hpp> #include <boost/python/raw_function.hpp> using namespace boost::python;
namespace { class X { public: object memberraw(const tuple& args, const dict& kw) { return make_tuple(args, kw); } };
object memberrawfwd(tuple raw, dict kw) { tuple arg = extract<tuple&>(raw.slice(1, _))();
Why didn't you just do it the way I told you to? Did that fail somehow? This should be tuple arg( raw.slice(1,_) );
return extract<X&>(raw[0])(). memberraw(arg, kw); }
};
BOOST_PYTHON_MODULE(PythonTest) { class_<X>("X") .def("memberraw", raw_function(memberrawfwd)) ; }
-- Dave Abrahams Boost Consulting www.boost-consulting.com
participants (2)
-
David Abrahams -
Studious Apprentice