又一个lua与C++粘合层框架

本文介绍了作者为解决lua与C++交互API繁琐问题,自创的一款轻量级粘合层框架。该框架无需第三方库,提供丰富的错误信息,支持C++原生类型及STL容器类型的转换,同时支持lua中的namespace功能。实现机制包括lua参数与C++参数的转换,C++函数与lua函数的对应。示例展示了如何定制内存分配器和注册自由函数。
摘要由CSDN通过智能技术生成

背景:

这是之前那篇烂文章的一个扩展吧!在游戏领域,特别多的使用到lua,作为C++的补充,当然会用到lua与C++的交互。lua提供了与C++交互的API,但是这些API各种坑爹、各种坑,各种繁琐,有的API操作了lua栈,有的却没有。为了解决lua原生API的问题,就出现了一些框架、库来改善,比如lua++,luabind…,窃以为,luabind是史上最强大的lua与C++粘合层,无出其右者。但是,他依赖于boost,靠,这就是我不爽他的地方,所以,咱撸起袖子,自造了一个粘合层框架。

更新:


1. 支持gcc4.7及以后版本
2. 支持lua5.2及以后版本


目标:

  1. 独立,无需第三方库依赖
  2. 小巧,仅提供大多数场景的功能需求
  3. 易用,接口简单明确
  4. 方便,提供完备的错误信息

 

目录结构:

image

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:  
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值