Hi
I try to expose the following class to python (using gcc 4.5.1, boost
1_44_0, Python 2.7.1):
// C++
class A
{
public:
int getName(const char*& name); // suppose the implementation
assigns the const char* x = "foo"; variable to the ref-pointer
}
I'd like to expose this API as is and not alter the method interface so I
think I'll have to do s.th. like this:
====================================
# intended usage in Python:
>>> import test
>>> a = A()
>>> x = const_char_ptr_ref()
>>> y = a.getName(x)
>>> x()
'foo'
====================================
I followed the "recipes" of the python test example, realizing that
- m1.cpp
-extract.cpp
and tried to get the things together, knowing that those example do not
really match my use case.
My understanding for what I need to do, are the following steps:
(1) encapsulate the const char*& variable in a container class, let's
say ConstCharPtrRef""
(2) expose the ConstCharPtrRef class to Python
(3) provide a factory function for the class exposed in the step (2)
(4) expose the factory function from step (3)
(5) provide an extractor function which extracts the "const char*&"
variable from within the given python argument
(6) register a from_python converter for the given type and the
provided extractor function
====================================
Here is what I tried so far (Remark: This is code is not compilable/running
)
====================================
// Step 1: Container class
class ConstCharPtrRef
{
public:
ConstCharPtrRef(): c_ptr(NULL), x(c_ptr)
{
};
const char *c_ptr;
const char *&x;
};;
// Step 3: Factory function
object const_char_ptr_ref()
{
return object(boost::cref(new ConstCharPtrRef()));
};
// Step 4:
// Extractor 1.st Try
struct extract_const_char_ptr_ref
{
ConstCharPtrRef& p = extract<ConstCharPtrRef&>(o);
return p.x;
};
// Extractor 2.nd Try
static const char*& execute(PyObject* o) {
ConstCharPtrRef& p = extract<ConstCharPtrRef&>(o);
return p.x;
};
//
BOOST_PYTHON_MODULE(test)
{
// Step 2: Expose container class stuff
class_<ConstCharPtrRef, ConstCharPtrRef,
boost::noncopyable>("ConstCharPtrRef", no_init);
// Step 4:
def("const_char_ptr_ref", &const_char_ptr_ref);
// Step 5: register from_python converter (Both tries are commented
out)
// from_python registration: 1.Try
// lvalue_from_pytype< &extract_const_char_ptr_ref,
type_id<ConstCharPtrRef>() >(); // causes ERROR (1) see below
// from_python registration: 2.Try:
// boost::python::converter::registry::insert( &execute,
type_id<ConstCharPtrRef>()); // causes ERROR (2) see below
// Finally: Expose the class "A"
bp::class_<A>("A")
.def("getName", &A::getName)
;
};
====================================
My questions are:
1. Are the steps I mentioned above correct, or is there something
missing
2. I tried different ways (see code snippet above for the names) to
get the things together with no success:
1.st Try:
- extractor: "struct extract_const_char_ptr_ref" with
static "execute" method
- registration: "lvalue_from_python()"
ERROR (1) ==> this one complains:
error: wrong number of template arguments (1, should be
2)
boost_1_44_0/boost/python/lvalue_from_pytype.hpp:87:8:
error: provided for 'template<class Extractor,
const PyTypeObject* python_type> struct boost::python::lvalue_from_pytype'
2.nd Try:
- extractor: global static "execute" function
- registration:
boost::python::converter::registry::insert ()
ERROR (2) ==> this one complains:
error: call of overloaded 'insert(const char*&
(*)(PyObject*), boost::python::type_info)' is ambiguous
boost_1_44_0/boost/python/converter/registry.hpp:30:26:
note: candidates are:
void
boost::python::converter::registry::insert(PyObject* (*)(const void*),
boost::python::type_info, const PyTypeObject* (*)()) <near match>
boost_1_44_0/boost/python/converter/registry.hpp:33:26:
note:
void
boost::python::converter::registry::insert(void* (*)(PyObject*),
boost::python::type_info, const PyTypeObject* (*)()) <near match>
I also tried to adapt the scenario found in
http://boost.2283326.n4.nabble.com/C-sig-from-python-converter-problem-unable-to-match-C-signature-td2698994.html
to my case, but wasn't successful.
So I really have no clue, which is the right Boost.Python to get the
things done.
Any help would be appreciated to get this running
Thanks
Rainer
Landesbank Baden-Wuerttemberg
Anstalt des oeffentlichen Rechts
Hauptsitze: Stuttgart, Karlsruhe, Mannheim, Mainz
HRA 12704
Amtsgericht Stuttgart
_______________________________________________
Cplusplus-sig mailing list
[email protected]
http://mail.python.org/mailman/listinfo/cplusplus-sig