独立的类名

我们有一个名为 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);

但是我不想这样做(假设程序员没有访问权)。

如果还是不理解,那我就放弃了。 :)

谢谢。

点赞
用户409744
用户409744

只要有正确的签名(int (*)(lua_State *L),也就是 lua_CFunction),您应该能够将任何方法作为 lua_register() 的第三个参数传递。它不必是类的静态成员,也可以是任何一个独立的函数:

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-29 09:02:58