У меня есть простой C-класс, который я реализовал, используя указатели функций в структуре для реализации функций-членов и передавая указатель на структуру в качестве первого аргумента каждой функции, аналогично неявному указателю "this" в С++.
%module mytest
%{
typedef struct mytest mytest;
struct mytest {
int data;
int (*func1)(mytest *,int);
void (*func2)(mytest *,int);
};
int f1(mytest *me,int n) { return me->data + n; }
void f2(mytest *me,int n) { me->data += n; }
mytest *mytestNew(int n) {
mytest *me = (mytest*) malloc(sizeof(mytest));
me->data = n;
me->func1 = f1;
me->func2 = f2;
return me;
}
%}
typedef struct mytest mytest;
struct mytest {
int data;
int func1(mytest *,int);
void func2(mytest *,int);
};
extern mytest *mytestNew(int n);
Теперь моя проблема заключается в том, что когда интерфейс создается для любого языка, который я выбираю во внешнем интерфейсе, мне приходится явно передавать указатель «this» на объект, даже если сам язык поддерживает скрытие этого.
Например, предположим, что я выбираю Python. Я должен сделать что-то вроде этого:
from mytest import *
m = mytestNew(1)
m.func1(m,0)
Где я действительно хочу сделать это так:
from mytest import *
m = mytestNew(1)
m.func1(0)
Я знаю, что мог бы просто написать код-обертку, но для моего реального проекта у меня есть много функций во многих объектов существующего кода C и умножить это на каждый язык, который я хочу поддерживать, это слишком много работы! Есть ли способ заставить SWIG делать это автоматически?