gpt4 book ai didi

c++ - 来自 C++ 的 Lua 回调

转载 作者:太空宇宙 更新时间:2023-11-04 16:18:18 25 4
gpt4 key购买 nike

我有一个 c++ 主机,我在其中使用 tolua++ 将一些类公开给 Lua。其中一个类有一个函数,应该从 lua 注册一个回调。所以当 C++ 代码需要调用一个 Lua 注册函数时它可以。然而,该函数是一个表/类函数。我之前用字符串函数名(不是 lua“类”的一部分)成功地完成了这个,但我很好奇我是否能够以某种方式存储 Lua 函数而不是函数名。

我这样定义我的 lua 类:

MyClass = {}

function MyClass:Create()
local obj = {}

-- copy all functions from MyClass table to this local obj and return it
local k,v
for k,v in pairs(obj) do
obj[k] = v
end

return obj
end

function MyClass:Enter()
self.CPlusClass = CPlusClass:Create() -- this is the C++ class creation, I defined a static function Create()
self.CPlusClass:RegisterCallback(15, self.Callback) -- this is where I want to pass this instances function to be called back from the C++ class
end

function MyClass:Callback(reader)
-- I want to be able to use self here as well so it needs to be the same instance
end

在 MyClass:Enter() 内部,我想注册 lua“类”函数 MyClass::Callback 以便能够从 C++ 对象调用。我如何将其传递给 C++ 函数?什么类型才能从 C++ 调用 MyClass:Callback() 并传入“self”以便它成为该类的相同“实例”?

所以我知道“self”指的是我创建的一个实际变量,我假设它会按变量名出现在全局表中,但是当你在 lua“类”中时,我怎么知道变量名是什么“self” ' 也指代?如果我能得到它,我可以将它传递给我的 C++ 函数并将其存储为字符串,以便我可以对其调用 getglobal 以获取该特定表,然后我还可以将表函数名称作为字符串传递,在 C++ 中我可以也得到它,然后调用它。但问题是,我如何才能将“self”转换为它指向的实际变量名,以便我可以在 C++ 中调用 getglobal 来获取该表?

最佳答案

您将 CPlusClass“类”从 C++ 导出到 Lua:这个 C++ 类肯定有一个 RegisterCallback,它接受指向函数的指针或指向使用虚拟方法分派(dispatch)到正确对象的 YourCallbackClass 实例的指针。然后,您只需将 YourCallbackClass 导出到 Lua:在幕后,Lua 版本将创建一个实例并将其提供给您的 C++ RegisterCallback。例如:

class CPlusClass {
public:
RegisterCallback(int val, CPlusCallback* cb) { ... store cb for later... }
};

class SomeObj; // type of Objects that you want to call back into

class CPlusCallback {
public:
typedef void (SomeObj::*Method)();
CPlusCallback(SomeObj* obj, Method method) { callee=obj; method=method; }
call() { callee->*Method(); }
private:
SomeObj* callee;
Method method;
};

您的 CPlusCallback 可能不同,这只是一个示例。例如,如果你只想要函数而不是方法,那么你不需要存储被调用者。如果两者都需要,则 CPlusCallback 必须是基类并且 call() 是虚拟的,派生类根据需要实现细节。适应你的情况。

然后将CPlusCallback和SomeObj导出到Lua中,然后你就可以在Lua中做:

somObj = SomeObj:Create()

function MyClass:Enter()
-- creates Lua instance of CPlusClass, with a user data for the C++
-- counterpart as member
self.CPlusClass = CPlusClass:Create()
self.CPlusCallback = CPlusCallback:Create(someObj, someObj.method)
self.CPlusClass:RegisterCallback(15, self.CPlusCallback)
end

上面假设 someObj.method 是您从 C++ 类 SomeObj 导出的方法,具有正确的签名 void (SomeObj::*Method)()。

关于c++ - 来自 C++ 的 Lua 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20101454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com