lua语言是一个非常好用的语言,一个特点是,非常轻量级。二个特点是,非容易扩展。三个特点是,lua与C++互调非常容易。
可以将一个C++中类的大部分方法,都可以绑定成lua语言的一部分。
下面的代码,是绑定我的库中DatetTime类的代码:
 1 void InitDateTime(lua_State * L)
void InitDateTime(lua_State * L)
 2

 {
{
 3 using namespace luabind;
    using namespace luabind;
 4 module(L,"zdh")
    module(L,"zdh")
 5 [
        [
 6 class_<XDate<XAnsiString> >("XDate")
            class_<XDate<XAnsiString> >("XDate")
 7 .def(constructor<XInt,XInt,XInt>())
            .def(constructor<XInt,XInt,XInt>())
 8 .def(constructor<>())
            .def(constructor<>())
 9 .def(constructor<XInt>())
            .def(constructor<XInt>())
10 .def(constructor<const XDate<XAnsiString> &>())
            .def(constructor<const XDate<XAnsiString> &>())
11 .def("SetNowDate",&XDate<XAnsiString>::SetNowDate)
            .def("SetNowDate",&XDate<XAnsiString>::SetNowDate)
12 .def("GetDay",&XDate<XAnsiString>::getDay)
            .def("GetDay",&XDate<XAnsiString>::getDay)
13 .def("GetMonth",&XDate<XAnsiString>::getMonth)
            .def("GetMonth",&XDate<XAnsiString>::getMonth)
14 .def("GetYear",&XDate<XAnsiString>::getYear)
            .def("GetYear",&XDate<XAnsiString>::getYear)
15 .def("SetDate",(void (XDate<XAnsiString>::*)(zdh::XInt,zdh::XInt,zdh::XInt))&XDate<XAnsiString>::SetDate)
            .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)
            .def("SetDate",(void (XDate<XAnsiString>::*)(zdh::XInt))&XDate<XAnsiString>::SetDate)
17 .def("SetDate",(void (XDate<XAnsiString>::*)(const zdh::XDate<XAnsiString> &))&XDate<XAnsiString>::SetDate)
            .def("SetDate",(void (XDate<XAnsiString>::*)(const zdh::XDate<XAnsiString> &))&XDate<XAnsiString>::SetDate)
18 .def("ToString",(zdh::XAnsiString (XDate<XAnsiString>::*)(void) const)&XDate<XAnsiString>::ToString)
            .def("ToString",(zdh::XAnsiString (XDate<XAnsiString>::*)(void) const)&XDate<XAnsiString>::ToString)
19 .def(self == XDate<XAnsiString>())
            .def(self == XDate<XAnsiString>())
20 .def(self < XDate<XAnsiString>())
            .def(self < XDate<XAnsiString>())
21 .def(self<=XDate<XAnsiString>())
            .def(self<=XDate<XAnsiString>())
22 ];
        ];
23 //(return_arg-type (classname::*)(arg1-type,grg2-type,
    //(return_arg-type (classname::*)(arg1-type,grg2-type, ))&classname::class_memberfunction
))&classname::class_memberfunction
24 //(void(CBase::*)(long))&CBase::Show)
    //(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--------
----fun.lua--------
 function addint ( x, y )
function addint ( x, y )
 local r = (x + y) * 10
    local r = (x + y) * 10
 return r
    return r
 end
end
 function printstring(s)
function printstring(s)
 print(s:c_str())
    print(s:c_str())
 end
end
 function printdate(d)
function printdate(d)
 printstring(d:ToString())
    printstring(d:ToString())
 end
end

然后,主要使用下面的main,就可以有了一个已经扩展了的lua语言运营环境。
int main(int argc, char * argv[])
{
    lua_State *L = lua_open();    //初始化lua
    gL = L;
    luaL_openlibs(L);    //载入所有lua标准库
    luaL_dofile(L, "add.lua");
    Init(L);
    string s;
    cout<<"lua>";
    while(getline(cin,s))    //从cin中读入一行到s
    {
        if( s == "exit()" ) 
        {
            break;
        }
        //载入s里的lua代码后执行
        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++相互调用,非常简单。