【问题标题】:Pass C++ object to Lua function using LuaBridge or Lua使用 LuaBridge 或 Lua 将 C++ 对象传递给 Lua 函数
【发布时间】:2019-03-23 12:28:10
【问题描述】:

我有一个用 C++ 构造的大对象(我已经暴露给 Lua),我想在 Lua 中进行处理。

我可以使用lua_pushintegerlua_pushstring 将任何简单类型传递给 Lua 函数(intstring),但不能使用 C++ 类。我试过lua_pushlightuserdata,通过将指针推送到我的对象,但没有运气。

function process(object) --object is the c++ passed function
--return processed data
end

我该怎么做?这可能吗?

请注意,我想将一个用 C++ 构建的特定实例传递给 Lua。我可以公开构造函数并简单地使用类,但我需要使类成为单例。这是不可接受的。

【问题讨论】:

  • Here 是使用 Lua Bridge 注册类类型的示例。请注意,您可以覆盖 __call 运算符以防止构造类(或者在您的情况下返回单例,请参阅:链接示例中的 DoNotCreate 和 DoNotGarbageCollect)。从那里你会得到一个 LuaRef 到 process 函数并将对象作为参数传递。 LuaBridge 自动将指针转换为可以在 lua 脚本中使用的 LuaRef (lightuserdata)。
  • 请注意,当您在 Lua 中调用成员函数时,您使用 object:memberfun(...) 语法,因为 :object 作为隐藏的 this 参数传递。
  • @JamesPoag 我确实成功注册了课程。确实提到了“(我已经将(类)暴露给 Lua)”。我唯一的问题是我不能将类作为参数传递给函数。再一次,我可以传递简单类型(int、string)而不是类。
  • 你在传递一个指针吗?
  • 是的。我将一个指针(指向我的类)传递给 lua_pushlightuserdata 。 lua_pushlightuserdata 只接受一个指针。

标签: c++ lua luabridge


【解决方案1】:

如果您使用 LuaBridge 注册了您的类,那么您必须使用 LuaBridge 方法将 Object 指针推入 Lua 状态机。 LuaBridge 推送指针,然后使用lua_setmetatable 设置对象的元信息。此元表包含对象的实际描述。

using namespace luabridge;
// L = lua_state*

// Register class
getGlobalNamespace(L)
.beginClass<MyObjectClass>("MyObjectClass")
    .addData<float>("value", &MyObjectClass::value)
    .addFunction("method", &MyObjectClass::method)
.endClass();

MyObjectClass myObject; // single instance

// lookup script function in global table
LuaRef processFunc = getGlobal(L, "process");

if(processFunc.isFunction()){
     processFunc(&myObject);
}

Lua 脚本

function process(object) --object is the c++ passed function
   local a = object:method("params")
   return object.value * a;
end

【讨论】:

    猜你喜欢
    • 2013-04-14
    • 1970-01-01
    • 2021-08-13
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    • 2015-09-25
    相关资源
    最近更新 更多