Как использовать список Python для назначения std :: vector в C ++ с помощью SWIG?

У меня есть простой класс C ++, который содержит элемент std :: vector и функцию-член, которая принимает std :: vector в качестве аргумента, который я обертываю SWIG и вызываю из Python. Ниже приведен пример кода.

После компиляции я перехожу на Python и делаю:

import test t = test.Test() a = [1, 2, 3] b = t.times2(a) # works fine t.data = a # fails! 

Сообщение об ошибке, которое я получаю:

 TypeError: in method 'Test_data_set', argument 2 of type 'std::vector< double,std::allocator< double > > *' 

Я знаю, что могу просто сделать:

 t.data = test.VectorDouble([1,2,3]) 

Но я хотел бы знать, как просто использовать список Python непосредственно в задании или, по крайней мере, понять, почему он не работает.


Вот пример кода.

test.i:

 %module test %include "std_vector.i" namespace std { %template(VectorDouble) vector<double>; }; %{ #include "test.hh" %} %include "test.hh" 

test.hh:

 #include <vector> class Test { public: std::vector<double> data; std::vector<double> times2(std::vector<double>); }; 

test.cc:

 #include "test.hh" std::vector<double> Test::times2( std::vector<double> a) { for(int i = 0; i < a.size(); ++i) { a[i] *= 2.0; } return a; } 

Makefile:

 _test.so: test.cc test.hh test.i swig -python -c++ test.i g++ -fpic -shared -o _test.so test.cc test_wrap.cxx -I/opt/local/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7 -L/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/config/ -lpython2.7 

2 Solutions collect form web for “Как использовать список Python для назначения std :: vector в C ++ с помощью SWIG?”

Попробуйте использовать директиву %naturalvar Test::data . В файле test.i :

 %naturalvar Test::data; %include "test.hh" 

Как описано в документации SWIG для членов C и C ++ , SWIG по умолчанию будет обращаться к вложенным структурам и классам с помощью указателей. %naturalvar направляет интерфейс для доступа по значению, а не по ссылке.

Посмотрите примерную главу примеров типов из документации SWIG: http://www.swig.org/Doc2.0/SWIGDocumentation.html#Typemaps_nn40 (в конце примера, где обсуждается доступ к структуре).

Вероятно, вам нужно добавить файловую систему memberin для вашего члена данных, и, возможно, out и in же порядке, если они еще не предоставлены SWIGs std_vector.i .

Python - лучший язык программирования в мире.