1.概述
LuaWrapper的源码请看。
LuaWrapper设计的初衷是为了方便Lua和C++之间桥接的库。库小巧(单头文件)、简单、快速和类型安全。除了lua库自己外,没有额外的依赖库,且不需要预编译;头文件简单到可以直接拖入工程就可以立即使用了。它甚至在一定程度上支持类继承。对象可以在Lua或C++中创建,并来回传递。
LuaWrapper的作者非常良心,提供了简单易用的示例工程用来介绍如何使用库,具体源码请看,关于示例的详细介绍后文书会详细介绍。
在Lua中对象即userdata,但是通过metatable几乎可以当做table来使用。每个userdata分别都有一个__index和__newindex函数,这两个函数都映射到一个table中,该table隐式存储在注册表中。
该库的主要函数如下:
luaW_is
luaW_to
luaW_check
luaW_push
luaW_register
luaW_extend
luaW_hold
luaW_release
(1)基本类型操作
(a)luaW_is
luaW_is
(b)luaW_to
luaW_to
(2)注册一个类
luaW_register
运行luaW_register来为你的类创建一个table和metatable。这将创建一个table,并通过table参数指定函数名称,除了函数new外。这通常适用于于C++中的静态方法。metatable变成您的每个类对象的metatable。这些可以看成是成员函数或者方法。
您还可以为没有默认构造函数或者需要指定set up或者tear down的类提供构造函数和析构函数。您也可以指定构造函数为NULL,这样意味着您将不能在您的类table中调用new函数。您将需要手工从C++推送对象。默认情况下,缺省构造函数用于创建对象,简单调用delete用于destroy对象。当使用构造函数的时候,您不能访问userdata的存储table。如果您想增加或者调整values到存储table,您可以使用指定的post构造函数metamethod(“__postctor”或者LUAW_POSTCTOR_KEY)。
默认情况下,LuaWrapper使用C++对象的地址来标识唯一的对象。在某些情况下,这是不需要的,例如shared_ptrs。两个shared_ptrs他们自己有唯一的内存地址,但是仍然表示相同对象。对于这种情况,可以指定一个标识符函数,该函数负责将表示对象的key推送到stack上。
(3)扩展一个类
luaW_extend
使用函数luaW_extend
(4)指针所有权
从Lua脚本创建对象(或者通过luaW_new创建)被认为是为Lua所有。所有权仅仅意味着当所有对它的引用都被移除时,垃圾收集器将删除该对象。在C++中创建并推送到Lua的对象不被认为是拥有的,除非luaW_hold
(5)Lua包装工具
第二个文件即LuaWrapperUtil.hpp包含许多可能有用的附加函数,它们构建在核心LuaWrapper
API之上。其主要特性是一些函数,这些函数自动将interger类型转换为enum类型,并为指向对象的指针模板化getter和setter原语。LuaWrapperUtil.hpp中所有函数的前缀都是luaU_。文件的注释中提供了文档和一些示例。
2.实例
未完,待续。。。。。