[C++-sig] Something like boost::any ... custom conversions?
Alex Mohr
amohr at pixar.com
Thu Nov 17 19:22:20 CET 2005
> You can do it for specific held types just by registering the
> appropriate from_python converters:
Actually, I'm trying something like the code below now and it seems to
be working so far. I haven't tested extensively yet. I'll have to
register on the order of 100 converters like this and I'm wondering how
much it might affect performance.
Is this a reasonable approach? Is there a better way? Is there some
gap in my understanding? Any comments are greatly appreciated.
Alex
// In this code, MyAny is a boost::any like object which has methods
// isHolding<T>() and get<T>()
//
using namespace boost::python;
template <typename T>
static void *convertible(PyObject *obj_ptr)
{
extract<MyAny> getAny(obj_ptr);
if (getAny.check()) {
MyAny a = getAny();
if (a.isHolding<T>())
return obj_ptr;
}
return 0;
}
template <typename T>
static void construct(PyObject *obj_ptr,
converter::rvalue_from_python_stage1_data *data)
{
MyAny a = extract<MyAny>(obj_ptr);
if (!a.isHolding<T>())
// throw an exception: type error.
void *storage =
((converter::rvalue_from_python_storage<T>*)data)
->storage.bytes;
new (storage) T(a.get<T>());
data->convertible = storage;
}
// Then I register converters like this
converter::registry::push_back(convertible<T>, construct<T>,
boost::python::type_id<T>());
More information about the Cplusplus-sig
mailing list