|
|
自己封装了一套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: ua;
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,但是其太笨重。该库的大部分功能本库都有,而且本库轻巧的多。
目前,国内的封装,厚着脸说,我还没见到更好的,如果哪位见到国内更胜于此的,请告诉我,以便见贤思齐。另外如果对此有兴趣的人多,我会把全部代码放出来的。
本库还有改进余地,若各位有其他期待请大胆提出。
(ACGFan = qslash)
[em20] |
|