我已經實現了一個簡單的C類,它使用結構中的函數指針來實現成員函數,並將指針傳遞給每個函數的第一個參數,類似於隱式的「this」在C++中的指針。如何讓SWIG自動將仿真的「this」指針包裝到C結構中?
%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自動執行此操作?
你的示例泄漏的方式 - 你想使用'%newobject mytestNew'來避免這種情況。出於好奇,有沒有第一個不使用C++的原因? – Flexo