金桥科普  
设为首页 关于我们 邮箱登录
科普聚焦时代科技科普生活科学技术自然科学航空航天科技博览历史考古电脑IT
您现在的位置: 首页 >> 科普频道 >> 电脑游戏 >> 文章详情
lua C_API 的 c++封装

ACGFan gameres 2006-09-30
自制 lua C_API 的 c++封装

自己封装了一套lua的c++封装库(5.1),优点是上手极容易,而且只有头文件(pure-.h),易于安装,可在vc8下编译通过。现在发一个示例:

 

 

//CPP
#include <iostream>

#include ".DxLua.h"//唯一需要include的头文件

using namespace std;

namespace Test{
struct test_t
{
  int n;
  const test_t* ft(test_t& r){cout<<"f(test_t* r)n";r.n = 55;return this;}
};
}

//完成c++类到lua的映射,在任意cpp文件内定义一次即可(不可重复定义)
BEGIN_CLASS2LUA(::Test::test_t)
LUA_METHOD(ft)
END_CLASS2LUA

void my_print(int v)
{
  cout<<"my_print:"<<v<<endl; 
};

int __cdecl main()
{
  using namespace Dx;
  using namespace Dx::Lua;

  try{
    Domain d;

    d.global["print"] = FUN2LUA(my_print);//可以替换库自带的print,FUN2LUA是宏

    d.LoadFile("Test.lua");

    Test::test_t t1 = {0},t2 = {0}; 
    Reference run_host(d.global["run_host"]);//Reference类指向任意lua对象

    run_host(UDT(t1),UDT(t2));//用户自定义类型用UDT作wrap
    cout<<t2.n<<endl;

    d += "run_host = function(t1,t2)t2:ft(t1) print(888) end";

    run_host = d.global["run_host"];
    run_host(UDT(t2),UDT(t1));

    for(TableRange<> rg(d.global["the_table"]);rg;++rg)//TableRange 作用相当于 iterator 用于遍历一个表
    {
      string k;
      Set(k) = rg.key;//从lua中读取变量
      cout<<k<<" : "<<(*rg).TypeName()<<endl;
    }

    string tmp;
    Set(tmp) = d.global["the_name"];
    cout<<tmp<<endl;
    Set(tmp) = d.global["the_table"]["name"];
    cout<<tmp<<endl;
    Set(tmp) = d.global["the_table"]["get_name"]("left","right");
    cout<<tmp<<endl;
    Reference newtb(d.global["make_table"]());
    Set(tmp) = (newtb->*newtb["fun"])();// = newtb:f();
    cout<<tmp<<endl;
  }
  catch(Lua::ScriptError& e)
  {
    cerr<<"n!!!catch a scrpt error:n"<<e.what();
  }
 return 0;
}

//Test.lua
the_table = {
[1] = {},
name = "Eri",
fun = function(t)
t.name = t.name.."Sch"
end,

sub_table = 
{
name = "Iori"
},
get_name = function(str1,str2)
return str1.." + "..str2
end,
get_pair = function(str1,str2)
return str1.." 1+ "..str2,str2.." 2+ "..str1
end,
name_test = "NaNi",
number_test = 54.6
}

the_name = "Slash"

function make_table()
t = 
{
name = " as it ",
fun = function(o)
o.name = o.name.." + "
return o.name
end
}
return t
end

function run_host(t1,t2)

t = t1:ft(t2)
t:ft(t1)
end

输出
f(test_t* r)
f(test_t* r)
55
f(test_t* r)
my_print:888
number_test : number
 : table
name : string
get_pair : function
name_test : string
get_name : function
sub_table : table
fun : function
Slash
Eri
left + right
 as it  +

我看过不少库,最完善的属配boost的lua-bind,但是其太笨重。该库的大部分功能本库都有,而且本库轻巧的多。
目前,国内的封装,厚着脸说,我还没见到更好的,如果哪位见到国内更胜于此的,请告诉我,以便见贤思齐。另外如果对此有兴趣的人多,我会把全部代码放出来的。

本库还有改进余地,若各位有其他期待请大胆提出。


  发表评论 写信给编辑 关闭窗口
同栏目内容
· 瑞典在网游中开设虚拟大使馆 2007-06-06
· 魔兽争霸3秘籍(魔兽无敌秘籍) 2007-03-28
· FreeType的教程代码 2006-09-30
· XNA2D入门 2006-09-30
· 第一次Collision AI 2006-09-30
· OpenGL GUI教程(一)2 2006-09-11
相关内容
近期主推
西藏发现青藏高原最大冰川群
·西藏发现青藏高原最大冰川群
·中日: "月亮女神"携手"嫦娥"
·行星大碰撞砸死恐龙催生人类
·美研制会飞汽车定价9万美元
·美国教授设计出自适应机器人
·银河系可能有20多个黑洞
近期热门
英海域惊现大龙虾为普通龙虾5倍
·英海域惊现大龙虾为普通龙虾5倍
·新物种金蛙体表有剧毒
·我国嫦娥工程计划测量月球
·精神病药物可治多种癌症
·视觉震撼:来自海底的精灵
·能删除不良记忆的药物诞生
近期焦点
广西发现罕见溶洞钟乳石有30万年
·广西发现罕见溶洞钟乳石有30万年
·澳大利亚惊现“卡布基诺”海滩
·美国"彩色"瀑布夜幕下震撼游人
·地球上究竟有多少个物种
·英国探险家北极游泳破纪录
·世界之最 世上最小的动物
金桥科普是一个公益性栏目,内容由作者提供或摘自互联网,其目的是向广大网民普及科学技术知识。如果您发现本网站转载或摘编了您拥有著作权的作品,请通知我们(电话:023-63659911),我们立即删除。
关于我们 | 网站地图 | 用户注册 | 广告客户 | 招聘信息 | 业务信息
Copyright@2006-2009 JQInfo.com,WONDER. All Rights Reserved
重庆科技咨询中心.重庆网得信息技术有限公司.版权所有
Email:webmaster@jqinfo.com
重庆数据通信局提供网络带宽. 渝ICP备05002327号