Luabind 是如何工作的?

我对 Luabind 包装器如何在不使用 lua_State *L 和不使用 Lua 栈的情况下传递函数很感兴趣。

Luabind 如何:

  1. 统计函数参数?
  2. 将函数参数与 Lua 栈连接起来?
  3. 将那些类连接起来?

我不是试图创建另一个类似于 Luabind 的绑定到其他库的绑定。我只是好奇他们是如何做到的。只是一个好奇的人。

原文链接 https://stackoverflow.com/questions/6114765

点赞
stackoverflow用户501459
stackoverflow用户501459

我不熟悉 luabind,但是“包装器”的整个概念是建立在某个低层抽象之上的,它将其封装起来。luabind 几乎肯定在内部使用了 lua_State

2011-05-25 00:39:04
stackoverflow用户282658
stackoverflow用户282658

手册 中可以得知:

第一件需要做的事情是调用 luabind::open(lua_State*) 函数,该函数将注册用于从 Lua 创建类的函数,并初始化一些由 luabind 使用的状态全局结构。

因此,我的(有点有根据)猜测是你需要执行 luabind::open 函数,它会缓存状态以便在其余函数中使用。(线索在于 “初始化一些由 luabind 使用的状态全局结构” 这一句话。)

2011-05-25 01:43:20
stackoverflow用户388847
stackoverflow用户388847

luabind为熟悉的int luafunction(lua_State * L)原型提供了模板包装函数,C API接受此原型。实际上,lua_CFunction已经为您创建。要调用的实际C或C++函数可以存储为封装的上值。对于C++成员函数,可以从第一个参数中获取'this'指针。

演示代码封装使用上值的C函数:

template<typename Rtypename T1>
int arg1wrapper(lua_State* L)
{
    typedef R(*F)(T1);
    F func =(F)lua_touserdata(L,lua_upvalueindex(1));
    R retValue = func(luaToC<T1>(L,1));
    push(L,retValue);
    返回1;
}

// example use
template<typename Rtypename T1>
void push(R (*func)(T1))
{
    lua_pushlightuserdata(L, func);
    lua_pushcclosure(L, &arg1wrapper<R, T1>, 1);
}

luaToC的模板化函数将专门针对库打算支持的每种C和C++类型进行专门化。类似地,push函数将进行重载。)

您会注意到,上述一对函数仅适用于一种特定类型的C函数;具有非void返回值和单个参数的函数。通过将返回值操作分解为第三个模板专门用于void,可以轻松处理void返回,但是要支持其他数量的参数,您需要一堆重载。 luabind这样做:它为其支持的每个参数数量都有一个重载,包括0个参数的一个(最大数量是他们选择的一些任意数字)。

(请注意,在C++0x中,您可以使用可变数量的模板来支持任意数量的参数)

2011-05-25 13:12:51