一个简单的注册c函数到lua的包装器

前段时间写了一个注册c函数到python的简单的包装器,今天依葫芦画瓢,写了一个注册c到lua的包装器。虽然注册c函数到lua我在以前也写过一个包装器,而且使用起来更简单

(参照网址:http://blog.csdn.net/siddontang/archive/2008/04/20/2309381.aspx)

但是这个方法时参考luaplus实现的,并不能算是我自己想到的,再加上这个实现绕来绕去的很容易把我自己都绕晕了,所以就又重新设计实现了一个。


在程序里,如果要把c函数注册给lua,我们需要些下面的包装函数


假设函数原型为int DoFun(int, int),


int CallFun(lua_State* pState)

{

       int param1 = (int)lua_tonumber(pState, 1);

       int param2 = (int)lua_tonumber(pState, 2);


       int ret = DoFun(param1, param2);


       lua_pushnumber(pState);


       return 1;

}


按照前文注册给python的方法,我们写如下类


template<typename Ret>

class CCallFun

{

public:

   

    template<typename P1, typename P2, typename Func, Func func>
    static int CallFun(lua_State* pState)
    {
        P1 p1 = CParseParam<P1>::ParseParam(pState, 1);
        P2 p2 = CParseParam<P2>::ParseParam(pState, 2);

        Ret ret = func(p1, p2);

        ParseRet(pState, ret);

        return 1;
    }

}


其中CParseParam<P1>::ParseParam是根据传入的P1来判断具体是什么类型,如果P1为int,那么在ParseParam里面,就会调用lua_tonumber从lua堆栈中取出数据。

ParseRet是根据传入的ret来判断返回值是什么类型的,如果Ret为int,那么在ParseRet里面,就会调用lua_pushnumber(),把ret压入lua堆栈。


在来一个注册函数,lua里面有一个注册函数,我觉得很方便,假设我们要注册DoFun给lua,只需如下进行


lua_CFunction pFun = CCallFun<int>::CallFun<int, int, int(*)(int,int), &DoFun>;

lua_register(luastate, "DoFun", pFun);


然后在lua里面,我们直接使用DoFun(10, 11)就可以调用c的函数了。

具体代码请参考

http://code.google.com/p/tangliu/downloads/list 里面的LuaScript.rar

原文地址:https://www.cnblogs.com/xiaowangba/p/6313793.html