lua語言是一個非常好用的語言,一個特點是,非常輕量級。二個特點是,非容易擴展。三個特點是,lua與C++互調非常容易。
可以將一個C++中類的大部分方法,都可以綁定成lua語言的一部分。
下面的代碼,是綁定我的庫中DatetTime類的代碼:
1
void InitDateTime(lua_State * L)
2

{
3
using namespace luabind;
4
module(L,"zdh")
5
[
6
class_<XDate<XAnsiString> >("XDate")
7
.def(constructor<XInt,XInt,XInt>())
8
.def(constructor<>())
9
.def(constructor<XInt>())
10
.def(constructor<const XDate<XAnsiString> &>())
11
.def("SetNowDate",&XDate<XAnsiString>::SetNowDate)
12
.def("GetDay",&XDate<XAnsiString>::getDay)
13
.def("GetMonth",&XDate<XAnsiString>::getMonth)
14
.def("GetYear",&XDate<XAnsiString>::getYear)
15
.def("SetDate",(void (XDate<XAnsiString>::*)(zdh::XInt,zdh::XInt,zdh::XInt))&XDate<XAnsiString>::SetDate)
16
.def("SetDate",(void (XDate<XAnsiString>::*)(zdh::XInt))&XDate<XAnsiString>::SetDate)
17
.def("SetDate",(void (XDate<XAnsiString>::*)(const zdh::XDate<XAnsiString> &))&XDate<XAnsiString>::SetDate)
18
.def("ToString",(zdh::XAnsiString (XDate<XAnsiString>::*)(void) const)&XDate<XAnsiString>::ToString)
19
.def(self == XDate<XAnsiString>())
20
.def(self < XDate<XAnsiString>())
21
.def(self<=XDate<XAnsiString>())
22
];
23
//(return_arg-type (classname::*)(arg1-type,grg2-type,
))&classname::class_memberfunction
24
//(void(CBase::*)(long))&CBase::Show)
25
}
下面是綁定我的庫中字符串的代碼
void InitString(lua_State * L)
{
using namespace luabind;
module(L,"zdh")
[
class_<XAnsiString>("XString")
.def(constructor<const XChar *>())
.def(constructor<>())
.def(constructor<const XAnsiString &>())
.def("c_str",(const zdh::XChar * (XAnsiString::*)(void) const)&XAnsiString::c_str)
.def("getLength",(zdh::XInt (XAnsiString::*)(void) const)&XAnsiString::getLength)
.def("Trim",(zdh::XAnsiString (XAnsiString::*)(void) const) &XAnsiString::Trim)
.def("Trim",(zdh::XAnsiString & (XAnsiString::*)(zdh::XAnsiString &) const)&XAnsiString::Trim)
];
}
下面兩個,是調用lua的XAnsiString與XDateTime輸出的函數。這兩個函數在lua中有定義。
void PrintString(const XAnsiString & paramStr)
{
luabind::call_function<void>(gL,"printstring",boost::ref(paramStr));
}
void PrintDate(const XDate<XAnsiString> & paramDate)
{
luabind::call_function<void>(gL,"printdate",boost::ref(paramDate));
}
下面,就是定義這些函數的lua語言代碼
----fun.lua--------
function addint ( x, y )
local r = (x + y) * 10
return r
end
function printstring(s)
print(s:c_str())
end
function printdate(d)
printstring(d:ToString())
end

然后,主要使用下面的main,就可以有了一個已經擴展了的lua語言運營環(huán)境。
int main(int argc, char * argv[])
{
lua_State *L = lua_open(); //初始化lua
gL = L;
luaL_openlibs(L); //載入所有l(wèi)ua標準庫
luaL_dofile(L, "add.lua");
Init(L);
string s;
cout<<"lua>";
while(getline(cin,s)) //從cin中讀入一行到s
{
if( s == "exit()" )
{
break;
}
//載入s里的lua代碼后執(zhí)行
bool err = luaL_loadbuffer(L, s.c_str(), s.length(),
"line") || lua_pcall(L, 0, 0, 0);
if(err)
{
//如果錯誤,顯示
cerr << lua_tostring(L, -1);
//彈出錯誤信息所在的最上層棧
lua_pop(L, 1);
cout<<endl;
}
cout<<"lua>";
}
lua_close(L);//關閉
return 0;
}
這里,使用luabind使用lua語言擴展和C++相互調用,非常簡單。