自制 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,但是其太笨重。該庫的大部分功能本庫都有,而且本庫輕巧的多。 目前,國內的封裝,厚著臉說,我還沒見到更好的,如果哪位見到國內更勝于此的,請告訴我,以便見賢思齊。另外如果對此有興趣的人多,我會把全部代碼放出來的。
本庫還有改進餘地,若各位有其他期待請大膽提出。 |