Обтекание std :: vector of boost :: shared_ptr в SWIG для Python - PullRequest
3 голосов
/ 04 апреля 2011

РЕДАКТИРОВАТЬ: Решено, моя ошибка;объяснил в моем ответе.

У меня есть это:

std::vector < boost::shared_ptr < Entity > > entities;

, и я пытаюсь выставить его через SWIG следующим образом:

%include "boost_shared_ptr.i"
%include "std_vector.i"

%shared_ptr(Entity)
%include <Entity.h>

namespace std {
    %template(EntityVector) vector<boost::shared_ptr<Entity> >;
};

%include <TheFileWithEntities.h>

Однако в Python сущности заканчиваютсяБудучи кортежем:

import MyModule
print type(MyModule.cvar.entities)
# Output: (type 'tuple')

Я гуглил по этому поводу, но не смог найти конкретных примеров того, как это обернуть.На одной странице был приведен небольшой пример упаковки для C #, но в моем случае это не помогло.

Любая помощь очень ценится.

Ответы [ 3 ]

4 голосов
/ 03 октября 2011

Мне было трудно заставить последовательность объектов-указателей Python автоматически конвертировать в std::vector объекты-указатели.Я в настоящее время (застрял) с помощью Swig 1.3;YMMV, если вы используете Swig 2. Хитрость была в том, чтобы создать экземпляр в файле интерфейса Swig (с %template) не только вектором и не только объектом, но и объектами-указателями:

%include "std_vector.i"
%template(myObjectT) namespace::of::myObject<T>;
%template(myObjectPtrT) boost::shared_ptr<namespace::of::myObject<T> >;
%template(myObjectVectorT) std::vector<boost::shared_ptr<namespace::of::myObject<T> > >;

Без myObjectPtrT Swig, кажется, не знает достаточно, чтобы преобразовать последовательность указателей Python в myObjectT в myObjectVectorT.

ОБНОВЛЕНИЕ: по какой-то причине я пока не смогчтобы понять, это приводит к невозможности вызова методов на myObjectT из myObjectPtrT, хотя я также использовал SWIG_SHARED_PTR(myObjectT, myObject<T>).

0 голосов
/ 05 апреля 2011

SWIG, кажется, оборачивает глобальные переменные типа std :: vector в кортежи. Решение состоит в том, чтобы переместить сущности в класс и получить к нему доступ через экземпляр этого класса. Пример:

class Globals
{
public:
     std::vector < boost::shared_ptr < Entity > > entities;
};

extern Globals globals;
0 голосов
/ 04 апреля 2011

См. Как представить std :: vector в виде списка Python, используя SWIG? для получения полезной информации

...