lua手动绑定c++函数使用luaL_checkudata 和 luaL_newmetatable 联动

luaL_checkudata 用法

luaL_checkudata 和 luaL_newmetatable 是联动的。luaL_newmetatable 用于创建和注册一个元表,而 luaL_checkudata 用于从 Lua 栈中获取用户数据并确保其元表与预期的元表名称匹配。下面我们详细解释两者如何联动工作。

luaL_newmetatable

int luaL_newmetatable(lua_State *L, const char *tname);

创建并注册一个名为 tname 的元表,如果这个元表已经存在则返回该元表。
该元表被存储在 Lua 的注册表中,这样在后续的 Lua 操作中可以通过名字 tname 找到这个元表。

luaL_checkudata

void *luaL_checkudata(lua_State *L, int ud, const char *tname);

从 Lua 栈中获取索引为 ud 的用户数据。
检查该用户数据的元表是否与名字为 tname 的元表匹配。
如果匹配成功,返回指向用户数据的指针。
如果不匹配或索引 ud 处的值不是用户数据,抛出错误。

联动工作示例

创建和注册元表:
使用 luaL_newmetatable 创建和注册元表。这一步通常在初始化阶段完成。

luaL_newmetatable(L, "AMetaTable");
luaL_newmetatable(L, "BMetaTable");

创建用户数据并设置元表:
使用 lua_newuserdata 创建用户数据,并将元表设置为之前注册的元表。

AObject* luaImage = static_cast<HObject*>(lua_newuserdata(L, sizeof(AObject)));
*luaImage = image;  // 初始化用户数据
luaL_getmetatable(L, "AMetaTable");
lua_setmetatable(L, -2);

从 Lua 栈中获取用户数据并检查元表:
使用 luaL_checkudata 从 Lua 栈中获取用户数据,并检查其元表是否匹配。

AObject* a1= static_cast<HObject*>(luaL_checkudata(L, 2, "AMetaTable"));
BObject* b1= static_cast<cv::Mat*>(luaL_checkudata(L, 3, "BMetaTable"));

相关推荐

  1. C++11中引入的bindfunction函数对象

    2024-06-14 19:34:04       30 阅读
  2. 2312d,d语言来C++rust

    2024-06-14 19:34:04       58 阅读
  3. 静态动态的介绍?

    2024-06-14 19:34:04       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-14 19:34:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-14 19:34:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-06-14 19:34:04       82 阅读
  4. Python语言-面向对象

    2024-06-14 19:34:04       91 阅读

热门阅读

  1. DevOps的原理及应用详解(六)

    2024-06-14 19:34:04       31 阅读
  2. Linux 服务器 CUDA两版本

    2024-06-14 19:34:04       33 阅读
  3. C++学习(20)

    2024-06-14 19:34:04       28 阅读
  4. 第壹章第15节 C#和TS语言对比-泛型

    2024-06-14 19:34:04       23 阅读