4

我们使用 tolua++ 为 C++ 类生成 Lua 绑定。

假设我有一个 C++ 类:

class Foo
{
    //Some methods in Foo, irrelevant to question.
};

和一个具有以下内容的 tolua .pkg 文件

class Foo
{
};

考虑以下函数:

void call_some_lua_function(lua_State* luaState)
{
    Foo* myFoo = new Foo();
    tolua_pushusertype(luaState, (void*)myFoo, "Foo"); 

    //More code to actually call Lua, irrelevant to question.   
}

现在,实际的问题:

如果第三个参数不对应于通过调用 tolua_cclass 注册的 C++ 类的有效完全限定字符串,则 tolua_pushusertype 会导致 Lua 中的段错误。所以,如果参数 3 的位置是“Bar”,我们会得到一个段错误。

我想做的是以下几点:

void call_some_lua_function(lua_State* luaState)
{

    //determine if tolua is aware of my type, how to do this?
    //Something like:
    //if(!tolua_iscpptype_registered("Foo"))
    //{
    //   abort gracefully
    //}

    Foo* myFoo = new Foo();
    tolua_pushusertype(luaState, (void*)myFoo, "Foo"); 

    //More code to actually call Lua, irrelevant to question.   
}

有没有办法使用 tolua 做到这一点?

4

2 回答 2

1

我使用的是 tolua,而不是 tolua++,但我们希望它有点相似。在 tolua 中,您可以测试该类是否已向其注册,如下所示:

tolua_getmetatable(L, "ClassName");
if (lua_isnil(L, -1)) {
   // the class wasn't found
}

提示:检查 tolua.cast 是如何实现的并检查它的参数。它将类型名称作为字符串。

编辑:更好奇,我下载了 tolua++ 源代码并查看了里面。它看起来并不完全相似,并且缺少关键功能。我必须给你一个可能有效的未经测试的建议:

luaL_getmetatable(L, "ClassName");
if (lua_isnil(L, -1)) {
   // the class wasn't found
}

tolua 和 tolua++ 之间的区别似乎在于 tolua 为其创建的元表使用“命名空间”(“tolua.”前缀)。

于 2010-04-19T00:07:30.680 回答
0

我只是一个 lua 初学者,因此我的建议是:将你的 tolua 调用包装在你自己的函数中,该函数跟踪通过它注册的类。现在你可以询问你的包装器 tolua 是否知道你的类。

于 2010-04-16T16:56:22.433 回答