使用C+;SWIG+;函数指针?

使用C+;SWIG+;函数指针?,c,lua,swig,C,Lua,Swig,我试图在一个C项目中创建一个面向对象的、稍微多态的接口,并使用SWIG将这样一个接口导出到Lua(不幸的是,语言要求在短期内是相当固定的)。下面是我想为其生成包装器的接口示例: // In BaseObject.h typedef struct BaseObject { int member; int (*foo)(struct BaseObject *self, int param); } BaseObject; // Polymorphism: int derived_foo(st

我试图在一个C项目中创建一个面向对象的、稍微多态的接口,并使用SWIG将这样一个接口导出到Lua(不幸的是,语言要求在短期内是相当固定的)。下面是我想为其生成包装器的接口示例:

// 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"
这基本上是在纯C上下文中模拟OO风格的多态性。现在我想使用SWIG从Lua调用这个结构的方法。到目前为止,我想到的最好的方法是:

// BaseObject.i
%module BaseObject
%{
#include "BaseObject.h"
%}

typedef struct BaseObject {
  int foo(struct BaseObject *self, int param);
} BaseObject;
i、 e.使用SWIG的“成员功能”支持。然而,这在开头附加了一个额外的“self”引用,因此我必须在Lua中传递两次“self”引用:

删除SWIG接口文件中的
struct BaseObject*
param几乎可以工作,但会破坏生成的包装,因为SWIG调用“成员函数”,如下所示:

// BaseObject_wrap.c
// arg1 = the BaseObject
// arg2 = param
result = (int)(arg1)->supports(arg2);
以前有人用过这种东西吗?提前感谢所有回复!:)

试试这个:

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