[C++-sig] Determine C++ type held by object?

Alex Mohr amohr at pixar.com
Tue Dec 13 22:36:27 CET 2005


extract<T>() is awesome for getting C++ objects out of python objects.
However, extract goes through the converters.  I would like a way to
determine whether an object is holding a particular C++ type without
going through converters.  Anyone know of a way to do this?


For those interested, here's why I would like it:

I am wrapping a boost::any-like object.

1. I want 'any' objects in python that are passed as arguments to
wrapped C++ functions to convert to their held type if necessary.  I
have this working just fine with a custom converter.  Call this
converter #1.

2. I want to be able to call wrapped C++ functions that take 'any'
objects with arbitrary python objects.  That is, I want objects of all
types to convert to 'any'.  I have attempted to write this converter.
Call it converter #2.

Here's the problem.  In #1's convertible() function, I have to check if 
the python object is holding an 'any', and if so, get it out and check 
if the type it's holding is a match.  I use extract<any> for this.

However, #1's call to extract<any> invokes converter #2.  Converter #2 
*always* says it can convert to 'any', and it does so by actually 
constructing an 'any' object holding what it was given.  Unfortunately, 
this invokes converter #1 again during the 'any' constructor.  Since #1 
tries to extract<any> from what it was passed, we get back into 
converter #2.  To infinity and beyond.

I can actually fix this by having converter #1 set a flag during its 
operation indicating that it, in fact, is trying to extract<any>.  Then 
converter #2 checks this flag and returns 0 in convertible() if it is 
set.  This works, but is not very satisfying.

Anyway, if I had the ability to ask if a python object was holding a 
particular wrapped C++ type (my 'any') without going through converters, 
then in converter #1 I could just check that and only convert in that case.

Thanks,

Alex



More information about the Cplusplus-sig mailing list