【问题标题】:How to check if parameter passed to Lua is of user defined type?如何检查传递给 Lua 的参数是否属于用户定义类型?
【发布时间】:2011-08-10 22:42:02
【问题描述】:

我正在使用 Lua 为基于 Ogre3d 的应用程序实现脚本,但在检查输入函数的参数是否属于特定类型时遇到了问题 - Ogre::SceneNode*。有人知道我该怎么做吗?

有一些基本的 Lua 函数可以为 int 或 string 等内置类型执行此操作,例如

if(lua_isnumber(L,1)) {...}

但我不知道如何使用用户定义的类型。

【问题讨论】:

    标签: c++ scripting lua ogre


    【解决方案1】:

    如果您安排每个特定类型的userdata 共享一个元表,那么您可以使用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);
    

    【讨论】:

      【解决方案2】:

      我猜是lua_isuserdata(L, yourParam)

      合乎逻辑。

      【讨论】:

      • 是的,还有lua_islightuserdata()
      • 嗯是的,这似乎是对的,但我如何检查它是否是这种特定类型的数据以及这个 Ogre::SceneNode 是否存在?
      • @Heandel 好的,所以我现在得到了这个:Ogre::SceneNode* sceneNode = dynamic_cast<Ogre::SceneNode*>( lua_touserdata(L, 2) ); 但我不能这样做,因为错误 C2681: 'void *' : invalid expression type for dynamic_cast
      • @Heandel:你这是什么意思?我现在做了这样的事情:sceneNode = (Ogre::SceneNode*)( lua_touserdata(L, 2) ); 但无论如何lua_islightuserdata(L,2)lua_isuserdata(L,2) 返回false。显然它可以是另一种类型,但它不应该。
      • @Haendel :我认为我将不得不实现比我想象的更多的东西。问题是我想在 .lua 文件函数中运行,该函数将 Ogre::SceneNode* 作为参数,但我可以将foo(mNode) 放在哪里 mNode 是来自 c++ 类的变量吗?我现在对此表示怀疑:/ 为此,我必须编写一个返回用户类型数据的函数。我怎样才能做到这一点 ?我发现lua_pushuserdata()有一些问题。
      猜你喜欢
      • 2015-02-19
      • 2018-06-08
      • 2012-08-19
      • 2020-11-14
      • 1970-01-01
      • 1970-01-01
      • 2017-12-25
      • 2015-04-06
      • 2013-05-01
      相关资源
      最近更新 更多