0
我試圖在C項目中創建一個面向對象,稍微多態的接口,並使用SWIG將這樣的接口導出到Lua(不幸的是,語言需求在短期內相當固定)。下面是我要生成一個包裝爲一個接口的例子:用C + SWIG +函數指針假假對象 - 重力?
// In BaseObject.h
typedef struct BaseObject {
int member;
int (*foo)(struct BaseObject *self, int param);
} BaseObject;
// Polymorphism:
int derived_foo(struct BaseObject *self, int param) {
return param * self->member;
}
// Making a "DerivedObject"
BaseObject *obj = malloc(sizeof(BaseObject));
obj->member = 20;
printf("%d\n", obj->foo(obj, 40)); // "800"
這基本上是模仿OO風格多態性在純C環境。我現在想用Lua使用SWIG調用這個結構的方法。我想出了迄今爲止最好的是這樣的:使用痛飲的「成員函數」支持
// BaseObject.i
%module BaseObject
%{
#include "BaseObject.h"
%}
typedef struct BaseObject {
int foo(struct BaseObject *self, int param);
} BaseObject;
即。然而,這對一個額外的「自我」參考之初大頭釘,所以我必須通過「自我」參考兩次在Lua:
-- bo is a BaseObject
bo.foo(bo, bo, 20)
-- this would be ideal, but isn't what I get right now:
bo.foo(bo, 20)
-- equivalently:
bo:foo(20)
在痛飲接口文件中刪除struct BaseObject *
PARAM幾乎作品,但打破了生成的包裝,因爲SWIG稱之爲「成員函數」如下:
// BaseObject_wrap.c
// arg1 = the BaseObject
// arg2 = param
result = (int)(arg1)->supports(arg2);
有沒有人得到這種類型的事情之前的工作?預先感謝所有回覆! :)