Boost Python: полиморфный контейнер?

У меня есть метод (или функция), который возвращает ссылку на список полиморфных объектов:

<code>class A {

};
class B : public A {

};


std::list<boost::shared_ptr<A> >& getList();
</code>

Как мне представить такую функцию в boost :: python, чтобы при итерации по списку в python я мог видеть разные типыAс иBс?

Ответы на вопрос(1)

Решение Вопроса

убедитесь, что ваши классы действительно полиморфны (то есть имеют хотя бы одну виртуальную функцию или виртуальный деструктор). Ваш приведенный выше пример не соответствует действительности, хотя я уверен, что ваш реальный вариант использования так и есть. Без этого ни один из механизмов полиморфизма на основе 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), но для простых задач это, вероятно, наиболее удобно.

 11 сент. 2015 г., 10:14
Относительно вопроса о том, как обернуть функцию, которая возвращает контейнер: этот метод также работает напрямую, предоставляя методы, возвращающие boost :: python :: list. То есть добавив boost :: shared_ptr к полиморфным элементам python в список. Разыменование указателей при доступе к списку во время выполнения будет затем выполняться неявным образом, как описано (если указанные определения register_ptr_to_python & lt; & gt; существуют).
 shoosh15 мая 2012 г., 17:20
действительно, виртуальный агент был тем, чего мне не хватало.

Ваш ответ на вопрос