[C++-sig] Extracting C++ objects of different types from a Python list
Christopher Woods
chryswoods at gmail.com
Thu Jun 28 09:43:02 CEST 2007
Hi Craig,
I've played with your example and I've got it to work by changing your
extract<BaseClass> and extract<BaseClass&> into extract<BaseClass*>
and extract<const BaseClass*>. In the first case (extract<BaseClass>)
you were extracting the object in the list into a *copy*, which was of
type BaseClass, so the "Useless base class" function of that copy was
then called. By extracting into a pointer (via extract<BaseClass*>)
you aren't performing a copy, and you obtain a polymorphic pointer to
the original object.
As for the typeid part of the example, I don't know why typeid gets it
wrong when you use extract<BaseClass&>. I had to change this to
extract<const BaseClass*> and then do a typeid of the dereference of
the resulting polymorphic pointer.
Here is the modified version of 'setList' that worked on my box
(linux, gcc 3.4, python 2.3);
==============================
void Importer::setList (list l) {
BaseClass *o;
int len = extract<int>(l.attr("__len__")());
for (int i=0; i<len; i++) {
std::cout << typeid( *(extract <const BaseClass*> (l[i]))
).name() << std::endl;
o = extract <BaseClass*> (l[i]);
o->evaluate();
}
}
==============================
This gave output;
==============================
1A
Index is 3
1B
Value is 5.234
==============================
I hope this helps,
Christopher
More information about the Cplusplus-sig
mailing list