Ich habe das damals selbst gestrikt, da mir luabind a) auch zu umstaendlich war und b) ich etwas anderes suchte.
Fuer Objekte musst du fuer jede Methode eine freie Funktion implementieren, das Binding halt. Einfaches Beispiel eines Objekts fuer die Methode implements:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
class IObject
{
public:
virtual ~IObject() {};
virtual const char* classname() const ;
virtual bool implements(const char* interface) const;;
};
int iobject_implements(lua_State* L)
{
int argc = lua_gettop(L);
if (argc != 2) // test number of arguments: object pointer + methode parameter
{
luaL_error(L,"%s","wrong number of arguments, 2 expected");
}
luaL_checktype(L, 1, LUA_TUSERDATA);
void** udata = (void**)lua_touserdata(L,1);
// type check ...
const char* s = luaL_checkstring(L,2);
// cast void* to correct type and call methode implements
// push the string on the lua stack as return argument
lua_pushboolean(L,static_cast<IObject*>(*udata)->implements(s));
// one return value
return 1;
}
|
Wie du das ganze in der Runtime von Lua registriest und entsprechende Tabellen und Metatabelleneintraege setzt, ob du noch was am Verhalten des garbage collectors aendern moechtest , musst du fuer deinen konkreten Fall selbst entscheiden.
Hier wurde die Variante "light user data" benutzt, die vorwiegend mit Zeigern arbeitet, andere wie "full user data" arbeitet mit ganzen Speicherbloecken in dem das Objekt enthalten ist. (Ich pushe und poppe lieber Zeiger auf den Stack als ganze Objekte)