0

我们有 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);

但我不想(假设程序员无法访问那里)。

如果还是看不懂,我就放弃了。:)

谢谢。

4

1 回答 1

1

您应该能够将任何方法作为第三个参数传递lua_register(),只要它有正确的签名(int (*)(lua_State *L)aka 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对象以及所有参数并处理返回值)调用用户函数。

于 2012-06-29T09:02:58.110 回答