Вопрос по c++, python – Boost Python: полиморфный контейнер?

5

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

<code>class A {

};
class B : public A {

};


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

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

Ваш Ответ

1   ответ
4

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

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

Похожие вопросы