前段时间写了一个注册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