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字符串(可以使用json11https://github.com/dropbox/json11),然后当做一整个字符串调用lua_pushstring传给Lua虚拟机,在Lua端解码JSON是非常方便的,比如使用dkjson LuaDist/dkjson · GitHub,收到字符串后只需要调用json.decode就可以解析出你要的table。
3,FFI (Foreign function interface)
这个就得使用LuaJIT了,参考它的ffi tutorial http://luajit.org/ext_ffi_tutorial.html
简而言之,就是它可以不用你写C binding代码就可以调用你的C 函数,并且能够操作C struct,需要注意的是它支持的C ABI而不是C++。
4,当你的C++代码需要导出很多数据结构给Lua的时候,说明你的Lua跟C++之间的粘合层已经太重了。
LuaTinker