[C++-sig] Wrapping std::vector<AbstractClass*>
Paul Melis
paul at pecm.nl
Fri Jul 1 20:00:07 CEST 2005
Hello,
I have an abstract class and a std::vector<> of pointers to this class.
A routine in my c++ code fills a vector with objects of classes derived
from the abstract class.
I'd like to iterate over the vector in python and use each of the items
in the vector depending on the type of derived class.
I have the following:
#include <vector>
#include <boost/python.hpp>
#include <boost/python/suite/indexing/vector_indexing_suite.hpp>
using namespace boost::python;
class Abstract
{
public:
virtual void f() =0;
};
class Concrete1 : public Abstract
{
public:
virtual void f() { }
};
typedef std::vector<Abstract*> ListOfObjects;
class DoesSomething
{
public:
DoesSomething() {}
ListOfObjects returnList() { ListOfObjects lst;
lst.push_back(new Concrete1()); return lst; }
};
BOOST_PYTHON_MODULE(test)
{
class_<Abstract, boost::noncopyable>("Abstract", no_init)
;
class_<ListOfObjects>("ListOfObjects")
.def( vector_indexing_suite<ListOfObjects>() )
;
class_<DoesSomething>("DoesSomething")
.def("returnList", &DoesSomething::returnList)
;
}
Now, when I put this stuff in a python module and try to use it I get:
Python 2.4 (#60, Nov 30 2004, 11:49:19) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> dir(test)
['Abstract', 'DoesSomething', 'ListOfObjects', '__doc__', '__file__',
'__name__']
>>> d = test.DoesSomething()
>>> d.returnList()
<test.ListOfObjects object at 0x009C5588>
>>> lst = d.returnList()
>>> lst[0]
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: No to_python (by-value) converter found for C++ type: class
Abstract
>>>
I suspect that boost.python will wrap the return value of returnList()
as a pointer to Abstract, without the possibility at runtime to look at
the actual object type. Is this something I would have to code by hand?
For example, by making a routine that takes a pointer to Abstract and
uses dynamic_cast<> to test which of the concrete classes the object
actually is from?
Paul
More information about the Cplusplus-sig
mailing list