2014-02-19 55 views
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); 

有沒有人得到這種類型的事情之前的工作?預先感謝所有回覆! :)

回答

0

試試這個:

typedef struct BaseObject { 
    static int foo(struct BaseObject *self, int param); 
} BaseObject;