Допустим, у меня есть пользовательский объект MyNamespace::MyProject::MyObj
и функция, которая возвращает один из них, например ...
bool myfunc(int a, MyNamespace::MyProject::MyObj &b);
Я обнаружил, что могу создать карту типов, которая будет b
возвращаемое значение с левой стороны в Python, поместив это в мой файл .i ...
%typemap(in,numinputs=0) ML::Processing::MyObj& {
// Create a persistent object to hold the result;
$1 = new ML::Processing::MyObj;
}
%typemap(argout) ML::Processing::MyObj& (PyObject* tmp) {
// Store the persistent object in a PyObject* that will be destroyed
// when it goes out of scope.
tmp = SWIG_NewPointerObj($1, $1_descriptor, SWIG_POINTER_OWN);
$result = SWIG_Python_AppendOutput($result, tmp);
}
Таким образом, в Python я могу сделать следующее ...
ok,b = mylib.myfunc(1)
Пока что все просто. Но теперь давайте предположим, что у меня есть другая функция, которая похожа, но принимает MyObj
в качестве ввода, например ...
bool myfunc2(int a, const MyNamespace::MyProject::MyObj &b)
Когда я пытаюсь вызвать это в Python (как показано ниже) Я получаю Wrong number or type of arguments
ошибку
ok,b = mylib.myfunc(1) # this works correctly
ok = mylib.myfunc2(1,b) # this complains
Я думаю, что это как-то связано с typemap(in,numinputs=0)
в файле .i ... как каждый раз, когда он видит MyNamespace::MyProject::MyObj &
, он теперь думает, что это возвращаемый аргумент вместо ввода.
Итак, мой вопрос, есть ли способ справиться с такой ситуацией, чтобы у меня могли быть как входная карта типов, так и выходная карта типов? Заранее благодарим всех вас, мастера swig-fu!