Я использую SWIG, чтобы обернуть c ++ в python, и мне нужно использовать typemap для того, чтобы сделать мой скрипт на python максимально простым. В качестве первой попытки я просто отправляю 2 списка, преобразовываю их в векторные, добавляю два вектора и возвращаю результат обратно в новый список.
Моя проблема в том, что я нахожу руководство по SWIG не очень поучительным, трудным для понимания и не даю каких-либо убедительных, полных примеров того, как я могу написать свою собственную карту типов.
Мои вопросы:
- Как мне обеспечить правильное преобразование моих списков в векторные, а затем обратно?
- Есть ли лучшие учебники / ссылки? там, как писать карты типов и что означают все синтаксис / функции?
Вот мой код:
add_array.h
#include <vector>
#include <functional>
std::vector<int> add_array(std::vector<int> src1, std::vector<int> src2);
add_array. i
%module add_array
%{
#include "add_array.h"
%}
%include std_vector.i
%template(vectorInt) std::vector<int>;
%include "add_array.h"
add_array.cpp
#include "add_array.h"
#include <cassert>
#include <cstring>
std::vector<int> add_array(std::vector<int> src1, std::vector<int> src2) {
assert(src1.size() == src2.size());
std::vector<int> dst;
dst.resize(src1.size());
for (size_t i = 0; i < src1.size(); i++) {
dst[i] = src1[i] + src2[i];
}
return dst;
}
Makefile
all:
rm -f *.so *.o *_wrap.* *.pyc *.gch add_array.py
swig -c++ -python add_array.i
g++ -fpic -c add_array_wrap.cxx add_array.h add_array.cpp -I/home/tools/anaconda3/pkgs/python-3.7.3-h0371630_0/include/python3.7m/
g++ -shared add_array_wrap.o add_array.o -o _add_array.so
array.py (это файл, который я запускаю)
import add_array
a = [1, 2, 3, 4, 5, 6]
b = [5, 6, 7, 8, 9, 10]
c = add_array.add_array(a, b)
print(c)
Вывод: (6, 8, 10, 12, 14, 16)
Это будет кортежем (я бы хотел, чтобы это был список). Похоже, мне просто повезло, что он может преобразовать входные списки в векторы (хотя в другом направлении это не так удачно), но мне бы очень хотелось узнать, как это происходит и как я могу изменить это для будущего кода, если это необходимо.
Спасибо!