[C++-sig] Boost.Python and Boost.Any
Kamal Mansouri
kranar at hotmail.com
Thu Jul 2 21:50:06 CEST 2009
Hello,
I am currently working on a way to convert boost::any to/from Python/C++.
So far the idea is that for any C++ type T exported to Python via Boost.Python,
you also register a function that converts an instance of boost::any storing a
value of type T to Python as well.
In other words, if you had a function f and exported it to Python as follows:
// C++ code:
boost::any f() {
int x = 5;
boost::any a = x;
return a;
}
Then in Python it is possible to do this:
x = f()
print x
And it will print "5", the result of f() automatically gets converted into a Python
integer instead of an instance of boost::any storing an integer.
This part I got working, thankfully, my problem is doing the flip side, passing the value
5 from Python to a C++ function that takes a boost::any as a parameter and having
that boost::any store an int.
The problem with the solution I have now is that when I pass an arbitrary Python value
to a function taking a boost::any, the boost::any holds an instance of type PyObject*.
My AnyFromPython converter looks like this:
struct AnyFromPython {
AnyFromPython() {
converter::registry::push_back(&convertible, &construct, type_id<any>());
}
static void* convertible(PyObject* value) {
return value;
}
static void construct(PyObject* value,
converter::rvalue_from_python_stage1_data* data) {
if(value == 0) {
throw_error_already_set();
}
void* storage = ((converter::rvalue_from_python_storage<any>*)
data)->storage.bytes;
new (storage) any(value);
data->convertible = storage;
}
};
The question is... is it possible to convert the parameter "value" into what it
would have otherwise been converted to in C++, and then take that result and
wrap it with a boost::any, as opposed to what it's doing now, which is just
wrapping a raw PyObject*.
If I could do this, then boost::any would work seamlessly with Python, and users
of my library would never need to know that boost::any is being used behind the
scenes in the C++ world.
Any help would be appreciated,
Kamal
_________________________________________________________________
Attention all humans. We are your photos. Free us.
http://go.microsoft.com/?linkid=9666046
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/cplusplus-sig/attachments/20090702/7f2acee9/attachment.htm>
More information about the Cplusplus-sig
mailing list