zoukankan      html  css  js  c++  java
  • 一个简单的注册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

  • 相关阅读:
    微信公众号,图片预览功能 有单个图片,
    MUI
    MUI学习01-顶部导航栏
    php验证18位身份证,准到必须输入正确的身份证号,
    微信sdk 图片上传 两种方法 上传一张显示一张 并附带微信图片放大功能和删除功能
    jQuery实现限制input框 textarea文本框输入字符数量的方法
    js jq 手机号实现(344) 附带删除功能 jq 实现银行卡没四个数加一个空格 附带删除功能
    山东省2016acm省赛
    East Central North America Region 2015
    North America Qualifier (2015)
  • 原文地址:https://www.cnblogs.com/xiaowangba/p/6313793.html
Copyright © 2011-2022 走看看