Вопрос по c++, python – Boost Python: полиморфный контейнер?
У меня есть метод (или функция), который возвращает ссылку на список полиморфных объектов:
<code>class A { }; class B : public A { }; std::list<boost::shared_ptr<A> >& getList(); </code>
Как мне представить такую функцию в boost :: python, чтобы при итерации по списку в python я мог видеть разные типыA
с иB
с?
убедитесь, что ваши классы действительно полиморфны (то есть имеют хотя бы одну виртуальную функцию или виртуальный деструктор). Ваш приведенный выше пример не соответствует действительности, хотя я уверен, что ваш реальный вариант использования так и есть. Без этого ни один из механизмов полиморфизма на основе RTTI Boost.Python не будет работать.
Затем, если вы выставили оба класса с Boost.Python и зарегистрировалисьshared_ptr
Конвертеры для них:
#include <boost/python.hpp>
namespace bp = boost::python;
BOOST_PYTHON_MODULE(example) {
bp::class_<A >("A");
bp::register_ptr_to_python< boost::shared_ptr<A> >();
bp::class_< B, bp::bases<A> >("B");
bp::register_ptr_to_python< boost::shared_ptr<B> >();
}
... это все, что вам нужно сделать, чтобы Python видел только наиболее производный тип. Нет необходимости делать что-то особенное для обеспеченияA
приведен кB
когда возможно.
Это все еще оставляет вопрос о том, как обернуть функцию, которая возвращает контейнер. Простейшим, вероятно, является использование набора индексации, включенного в Boost.Python:
http://www.boost.org/doc/libs/1_49_0/libs/python/doc/v2/indexing.html
В Интернете есть другие варианты (в том числе «версия 2» комплекта индексирования, которая во многих отношениях лучше, но не включена в Boost.Python), но для простых задач это, вероятно, наиболее удобно.