• 一个简单的注册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

  • 相关阅读:
    七种程序设计模式
    理清JavaScript正则表达式
    采用管道处理HTTP请求
    AngularJS之Service4
    Net Core-Razor
    中间件(Middleware)
    Redis集群明细文档(转)
    nginx 301跳转到带www域名方法rewrite(转)
    Redis启动多端口,运行多实例(转)
    web框架之Spring-MVC环境搭建(转)
  • 原文地址:https://www.cnblogs.com/xiaowangba/p/6313793.html
Copyright © 2020-2023  润新知