如何确定是否已向tolua注册了C ++ usertype

时间:2010-04-15 19:31:23

标签: c++ scripting lua tolua++

我们使用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.   
}

现在,实际问题:

如果第3个参数与通过调用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做到这一点?

2 个答案:

答案 0 :(得分: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。”前缀)使用了“命名空间”。

答案 1 :(得分:0)

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