tolua++的一些想法

http://www.runoob.com/lua/lua-metatables.html


tolua 和 tolua++的区别:tolua++是tolu a的扩展,他实现了一些toua没有的特性,比如多重继承,std::string等,新版的tolua也很老了,大概是2012年更新的吧,新版的tolua支持了类模版。tolu a++更是多年不更新,大概是2009年左右更新的吧,只支持lua5.1,现在lua都到5.3了。关于lua5.1 和lua5.3的区别,我一定要找个时间好好写写,所在的项目还是5.1,tolua++是最新的也就是1.0.93.。。。。
tolua++实现了C++和Lua代码的融合,让C++的代码可以在Lua中被调用。他就是一个工具,把C++代码转换成lu a可以调用的代码。
tolua++利用.pkg文件导出需要的类型,函数,对象。
tolua++并不完整的解析C++代码,只是解析一些用来描述暴露给lua功能的声明。
tolua++将C++的基本类型映射到Lua的基本类型。(C++中的char,int,float,double转化成LUA的NUMBER,cha r*和string转换成lua 的string,class,struct等转换成userdata),对于成员变量的读取赋值,tolua++是在metatable里新建了.get和.set两个表。两个表里分别存储了以变量名为键,以读取设置c函数为值的表项。在metatable的__index和__newindex里,以变量名为键,从.get和.set表里取得读取设置函数并调用。
tolua++之所以能实现C++的函数转换成lua的函数,是因为Lua中存在metatable(http://www.runoob.com/lua/lua-metatables.html)
.pkg文件
.pkg文件只列出所有暴露给lua使用的常数,变量,函数,类和方法。
.pkg文件可以包括常规头文件(其他的.pkg文件、C/C++头文件、Lua文件)。
e.g:$pfile “Framework/GameCommon.pkg”
$#include “3rdplatform/ChannelManager.h”
(文件类中的private,protected部分tolua++是不可以访问的。)
$lfile “example.lua”
tolua++的一些使用细节:
(1)基本数据类型:tolua++自动将C/C++的基本类型映射到lua的基本类型;
预处理unsigned、static、 short和const等修饰符, 所谓的预处理也就是给忽略掉了,在生成的.cpp目标文件中,.get方法还是有这些修饰符的,到.set中就吞掉了。项目用的是CEGUI,其中存在着CEGUI::String这个类型,tolua++转换到.pkg文件生成的.cpp文件的时候就已经是string类型了,因为CEGUI::String中有构造函数实现了转换,可以看看CEGUI的代码,CEGUI还是使用的拓展的tolua++,支持异常处理,新增加了tolua_throws这个函数,还是挺厉害的呢。
(2)用户自定义的数据类型都是LUA中有userdata嘛,就可以实现了
(3)typedef 
(4)常量:支持enum,define 在写代码时还挺常用的
(5)全局变量extern
(6)函数:注意传参数,不要传错类型
(7)数组:使用的时候指名index
(8)函数重载:tolua++支持函数重载。
e.g:void func (int a); 
void func (double a);
在C/C++中这代表两个不同的函数,然而在tolua里它们是同一个函数,因为int和double类型都映射到number。运行的时候tolua++决定那个函数被调用。
当性能很重要时,在.pkg文件中,我们应该把最常用的函数放在最后一个。可以看一些生成的.cpp文件中的重载函数,如果不是第一个声明的函数以外的函数在参数匹配错误的时候会执行****n-1这个函数,以此类推。
(9)函数缺省参数:在生成的 .cpp中,传参数的时候就会根据.pkg的文件中的默认参数来传递到栈中。
(10)结构体
(11)类和类方法:tolua++支持类的多态性和多重继承
(12)类模板:如果一个模板有多个宏,
class hash_map : public map {
  TEMPLATE_BIND(K V, int string, string vector)
  V get_element(K key);
  void set_element(K key, V value);
  hash_map();
  ~hash_map();
};
Lua代码这样调用:
string_vector_hash_map = hash_map_string_vector_double_:vew_local();
class vector {
  TEMPLATE_BIND(T, int, string, Vector3D, double)
  void clear();
  int size() const;
  const T& operator[](int index) const;
  T& operator[](int index);
  void push_back(T val);
  vector();
  ~vector();
};
Lua代码可以这样调用
string_vector = vector_string_:new_local()
string_vector:push_back("hello")
string_vector:push_back("world")
tolua++中对象生命周期的管理
C++类型构造函数使用tolua++导出到lua里时,析构函数也要注册到Lua。
  C++类型构造函数使用tolua++导出到lua里时,tolua++会自动生成new_local方法。如果在lua代码里,用这个方法新建对象时,tolua++会调用tolua_register_gc方法,指明回收对象时回收对象内存。
   对于指定由tolua++回收内存的对象,如果其类型的析构函数也通过tolua++导出了,则在回收内存时,会通过delete运算符,调用对象的析构函数。否则只会使用free方法回收。


tolua++性能问题:用户自定义的类型会存在多次new delete的过程

你可能感兴趣的:(lua)