一个luabind简单类绑定

一个luabind简单类绑定
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>::*)(voidconst)&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语言运营环境。
int  main( int  argc, char  *  argv[])
{
    lua_State 
* =  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++相互调用,非常简单。

你可能感兴趣的:(一个luabind简单类绑定)