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"));
相关推荐
草莓熊Lotso13 分钟前
《算法闯关指南:优选算法--前缀和》--31.连续数组,32.矩阵区域和
c++·线性代数·算法·矩阵
程序喵大人13 分钟前
CMake入门教程
开发语言·c++·cmake·cmake入门
csuzhucong14 分钟前
斜转魔方、斜转扭曲魔方
前端·c++·算法
我不会插花弄玉14 分钟前
类与对象-上【由浅入深-C++】
c++
老华带你飞18 分钟前
房屋租赁管理|基于springboot + vue房屋租赁管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·毕设
郝学胜-神的一滴19 分钟前
Horse3D游戏引擎研发笔记(十):在QtOpenGL环境下,视图矩阵与投影矩阵(摄像机)带你正式进入三维世界
c++·3d·unity·游戏引擎·godot·图形渲染·unreal engine
凛_Lin~~39 分钟前
安卓 Java线程八股文 (线程、多线程、线程池、线程安全)
android·java·开发语言
geekmice44 分钟前
thymeleaf处理参数传递问题
开发语言·lua
哈哈哈笑什么44 分钟前
企业级CompletableFuture并行化完整方案,接口从10s到100ms
java·后端·spring cloud
C雨后彩虹1 小时前
最少交换次数
java·数据结构·算法·华为·面试