一个类的独立名称

时间:2012-06-29 06:55:34

标签: c++ lua

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

但我不想(让我们假设程序员没有访问权限。)

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

感谢。

1 个答案:

答案 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对象以及所有参数和处理返回值)。