c++向Lua中传递复杂的结构该如何做?

http://www.zhihu.com/question/32195614

用userdata, 参考 Programming in Lua : 28.1
还可以考虑直接ffi,参考FFI Tutorial


如果在应用中这种需求比较频繁,你需要使用一个lua binder。
Binder的作用就是将宿主语言的数据包装成Lua可访问的对象(table或userdata)


对于结构体,用 struct 库,将数据 pack 到 string。lua 5.3 中已经加入到内建的 string 库中。
对于类,用 userdata + 元表。


1,使用table
比如在C++里有一个Point对象,内含x,y两个float,可以创建一个lua table,将字段名(x, y)设置为table的key,key的值设置为x, y的数值,涉及到lua_newtable合lua_setfield这几个API。
这是很通用的方法,但是如果你要导出给Lua的对象非常多并且结构又不固定的话这种方法就得编写很多操作table的代码。

2,通用序列化协议
要导出的数据结构变化大又很多的时候可以考虑使用JSON这样的通用序列化协议,C++里把map/vector序列化为JSON字符串(可以使用json11github.com/dropbox/json),然后当做一整个字符串调用lua_pushstring传给Lua虚拟机,在Lua端解码JSON是非常方便的,比如使用dkjson LuaDist/dkjson · GitHub,收到字符串后只需要调用json.decode就可以解析出你要的table。

3,FFI (Foreign function interface)
这个就得使用LuaJIT了,参考它的ffi tutorial luajit.org/ext_ffi_tuto
简而言之,就是它可以不用你写C binding代码就可以调用你的C 函数,并且能够操作C struct,需要注意的是它支持的C ABI而不是C++。

4,当你的C++代码需要导出很多数据结构给Lua的时候,说明你的Lua跟C++之间的粘合层已经太重了。


LuaTinker

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值