类的独立名称

Independent name of a class

本文关键字:独立      更新时间:2023-10-16

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

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

如果仍然无法理解,我就放弃。 :)

谢谢。

您应该

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