我们有班级lua。
在lua类中有一个方法registerFunc(),它定义为:
void lua::registerFun() {
lua_register( luaState, "asd", luaApi::asd);
lua_register( luaState, "zxc", luaApi::zxc);
}
lua_register是来自lua库的内置函数:http://pgl.yoyo.org/luai/i/lua_register
它将luaApi类中的静态方法作为第三个参数。
现在有些程序员想要使用lua类,所以他被迫创建自己的类,其中包含静态方法的定义,如:
class luaApi {
public:
static int asd();
static int zxc();
};
现在是重点。我不希望(作为程序员)创建名为“luaApi”的类,但是myClassForLuaApi。 但是现在它不可能,因为它是在代码中明确编写的 - 在lua类中:
lua_register( luaState, "asd", luaApi::asd);
我必须将其更改为:
lua_register( luaState, "asd", myClassForLuaApi::asd);
但我不想(让我们假设程序员没有访问权限。)
如果仍然无法理解,我会放弃。 :)
感谢。
答案 0 :(得分:1)
您应该能够将任何方法作为lua_register()
的第三个参数传递,只要它具有正确的签名(int (*)(lua_State *L)
a.k.a。lua_CFunction
)。它不必是类的静态成员,也可以是任何独立函数:
lua_register(luaState, "myFunction", &myFunction);
如果这不满足您,您应该添加一些更大的代码,例如你的lua
课程。如何向lua_register()
添加新的呼叫实例?你在使用一些预定义的宏吗?您是否被允许修改lua
类中的代码?除非你使用一些预处理器定义或宏来“弯曲”你的名字,否则你无能为力。
编辑:
如果您希望lua
类的用户能够注册他们自己的函数,那么您应该允许他们将它作为参数传递给方法(基本上也是Lua这样做的方式):
void lua::registerFunction(const char *name, lua_CFunction *call) {
lua_register(luaState, name, call);
}
如果你想抽象掉Lua的状态对象,你可以考虑做自己的包装器用自定义对象调用用户的函数(拥有lua
对象以及所有参数和处理返回值)。