如何检查传递给Lua的参数是否是用户定义的类型?
问题描述:
我正在为使用Lua的基于Ogre3d的应用程序实现脚本,并且遇到了检查参数是否属于特定类型的问题 - Ogre :: SceneNode *。任何人都知道我该怎么做?如何检查传递给Lua的参数是否是用户定义的类型?
有一些基本的Lua函数可以完成内置类型,如int或string等
if(lua_isnumber(L,1)) {...}
,但我不知道如何与用户定义类型做到这一点。
答
我猜lua_isuserdata(L, yourParam)
?
合乎逻辑。
答
如果您安排特定类型的每个userdata
共享metatable,则可以使用luaL_checkudata来确认它们的类型。这通常是库如何标记和标识它创建的数据。
下面是创建和检查用户数据使用此技术的一些功能:
static decContext *ldn_check_context (lua_State *L, int index)
{
decContext *dc = (decContext *)luaL_checkudata (L, index, dn_context_meta);
if (dc == NULL) luaL_argerror (L, index, "decNumber bad context");
return dc; /* leaves context on Lua stack */
}
static decContext *ldn_make_context (lua_State *L)
{
decContext *dc = (decContext *)lua_newuserdata(L, sizeof(decContext));
luaL_getmetatable (L, dn_context_meta);
lua_setmetatable (L, -2); /* set metatable */
return dc; /* leaves context on Lua stack */
}
元表与
const char *dn_context_meta = "decNumber_CoNTeXT_MeTA";
luaL_newmetatable (L, dn_context_meta);
是的创建,使用'lua_islightuserdata()沿' – sbk 2011-04-22 12:18:19
嗯是的,这似乎是正确的,但我怎么能检查它是否是这种特殊类型的数据,以及这个Ogre :: SceneNode是否存在? – Patryk 2011-04-22 12:30:40
@Heandel 好了,我现在得到这样的: '食人魔::场景结点*场景结= dynamic_cast的(lua_touserdata(L,2));' 但我不能做,因为 错误C2681 :'void *':dynamic_cast的无效表达式类型 – Patryk 2011-04-22 12:41:45