背景:
这是之前那篇烂文章的一个扩展吧!在游戏领域,特别多的使用到lua,作为C++的补充,当然会用到lua与C++的交互。lua提供了与C++交互的API,但是这些API各种坑爹、各种坑,各种繁琐,有的API操作了lua栈,有的却没有。为了解决lua原生API的问题,就出现了一些框架、库来改善,比如lua++,luabind…,窃以为,luabind是史上最强大的lua与C++粘合层,无出其右者。但是,他依赖于boost,靠,这就是我不爽他的地方,所以,咱撸起袖子,自造了一个粘合层框架。
更新:
目标:
- 独立,无需第三方库依赖
- 小巧,仅提供大多数场景的功能需求
- 易用,接口简单明确
- 方便,提供完备的错误信息
目录结构:
state.hpp—对lua_state封装,支持对内存定制
reference.hpp—对lua的function、string、table引用,提高性能会用到
module.hpp--支持类似C++中namespace功能,以table方式实现
lua_reg.hpp--头文件包含
iterator.hpp--对不定参数的迭代
execute.hpp--执行lua文件,对lua_pcall封装,支持错误处理
error.hpp--错误处理,提供fatal_error与parameter_error,支持对堆栈内容的解析
converter.hpp--C++数据与lua数据的转换,默认支持C++原生类型、std::string\std::pair\std::tuple\std::map\std::vector
config.hpp--这个没什么好说的
class.hpp--对C++类的支持
call.hpp--lua_pcall封装,C++调用lua函数,支持错误处理
优势:
1. 可定制内存分配器,满足allocate、deallocate即可,默认使用std::allocator
2. 错误信息丰富,堆栈、参数列表、详情
3. 参数转换可扩展,采用模板偏特化方式实现,默认有std::vector\std::pair\std::tuple\std::map\std::string等STL容器类型
4. 支持lua中namespace(即module),采用table实现
实现机制:
1. lua参数与C++参数转换
1: template < typename T, typename EnableT = void >
2: struct convertion_t;
当需要对lua与C++参数进行转换时,请考虑片特化此类,如void*对应lightuserdata
1: template < >
2: struct convertion_t<void *>
3: {
4: static void * from(state_t &state, int index)
5: {
6: LUAREG_ERROR(lua_islightuserdata(state, index) != 0, LUA_TLIGHTUSERDATA, index);
7:
8: return ::lua_touserdata(state, index);
9: }
10: