Lua开发者运行: 1758天

超越luabind的luaBridge

作者:LuaStudio 发布于:2015-12-28 9:28 Monday 分类:心得体会

最近准备在手机项目客户端中使用lua, 以前一直在服务器使用luabind. 另外, tolua++也体验过, LuaPlus也在早年用过. 以下是本人对这些绑定库的个人感觉:

luabind

利用boost机制把绑定做到极致, 比较适合主c++, 弱lua的脚本框架.

作者已经停止更新, 在windows/linux编译没问题, 但是在ios的LLVM下, 无法编译

tolua++

像cocos2dx使用tolua++也是可以理解的, 那么多函数需要绑定, tolua++的头文件parse及自动代码生成节约了很多手动绑定的时间.

但是看到代码中有一部分bugfix就心存不安(纯个人感觉, 本人使用不多, 欢迎砖头伺候),另外, tolua++只能由脚本层驱动C++, 而没有将已经实例化的句柄注册到lua的功能也是煞笔啊


LuaPlus

接口较为简单, 适于初学者上手, 无任何的模板, 性能不高


luaBridge

项目地址: https://github.com/vinniefalco/LuaBridge

手册: http://vinniefalco.com/LuaBridge/Manual.html

纯头文件实现, 无需编译, 包含进入工程即可, 接口简洁高效

相比luabind, 唯一不能实现的常用功能就是枚举, 但是可以支持类成员静态变量注册, 这个就无所谓了, 手写一个枚举支持也很简单

看下演示代码:

  1. class A
  2. {
  3. public:
  4.     A( )
  5.     {

  6.     }
  7.     virtual void foo( int a )
  8.     {
  9.         printf("foo base\n");
  10.     }

  11.     std::string Member;
  12. };

  13. class B : public A
  14. {
  15. public:
  16.     virtual void foo( int a )
  17.     {
  18.         printf("foo inherited\n");
  19.     }
  20. };
  21. void foo( int b )
  22. {

  23. }
  24. luabridge::getGlobalNamespace(L)
  25.         .beginClass<A>("Sobj")
  26.             .addConstructor<void (*) (void)> ()
  27.             .addFunction("foo", &A::foo)
  28.             .addData("Member",&A::Member)
  29.         .endClass()
  30.         .deriveClass<B, A>("SSec")
  31.             .addFunction("foo",&B::foo )
  32.         .endClass();

  33.     luabridge::getGlobalNamespace(L).addFunction("foo", foo );


  34.     B ins;
  35.     ins.Member = "data";
  36.     luabridge::setGlobal(L, ins, "ins");
  37. lua侧的代码

  38. local a = Sobj()
  39. a:foo(2)
  40. a.Member = "hello"


  41. ins:foo(3)

热烈欢迎各位留言,本人会虚心听取各位意见!