SWIG: Как обернуть boost :: shared_ptr в std :: vector? - PullRequest
2 голосов
/ 30 апреля 2011

У меня есть некоторый код C ++, который возвращает boost :: shared_ptr в std :: vector, однако я не могу заставить SWIG правильно обернуть это, чтобы сделать объект итеративным в Python.Без boost :: shared_ptr работает нормально.Кто-нибудь знает, как обернуть вектор, когда он внутри shared_ptr?

Вот пример, демонстрирующий проблему:

%module example

%include <std_vector.i>
%include <boost_shared_ptr.i>

%shared_ptr(Inner)
%shared_ptr(InnerVector)

%inline %{
#include <boost/shared_ptr.hpp>
#include <vector>

struct Inner {
  int dummy;
};
typedef std::vector< boost::shared_ptr<Inner> > InnerVector;
typedef boost::shared_ptr<InnerVector> InnerVectorPtr;

InnerVectorPtr getVectorPtr()
{
  InnerVectorPtr v(new InnerVector());
  boost::shared_ptr<Inner> i(new Inner);
  i->dummy = 222;
  v->push_back(i);
  return v;
}

%}

%template(InnerVector) ::std::vector< boost::shared_ptr<Inner> >;

И пример скрипта Python:

import example

v = example.getVectorPtr()
print 'Vector is:', v
for i in v:
     print 'Instance is:', i
     print 'Value is:', i.dummy

Что для меня говорит это:

Vector is: <Swig Object of type 'InnerVectorPtr *' at 0x1127270>
Traceback (most recent call last):
  File "test.py", line 5, in <module>
    for i in v:
TypeError: 'SwigPyObject' object is not iterable

Есть предложения?

Ответы [ 2 ]

1 голос
/ 29 февраля 2012

Вы решили свою проблему?

Я думал, что это может быть проблема с управлением именами, так как вы используете одно и то же имя InnerVector дважды:

%template(InnerVector) ::std::vector< boost::shared_ptr<Inner> >;

typedef std::vector< boost::shared_ptr<Inner> > InnerVector;

Ошибка TypeError: 'SwigPyObject' object is not iterable обычно означает, что SWIG не понимает, что объект, например, vector и должен быть преобразован в список Python.

1 голос
/ 30 апреля 2011

Возможно, вы захотите попробовать Boost.Python и Py ++ .Если вы уже используете Boost, он обеспечивает очень красивую (и практически автоматическую) упаковку сложных конструкций C ++.Я использовал его в нескольких проектах.

Также вам стоит взглянуть на этот вопрос он выглядит связанным, но не совсем вашей проблемой.

...