0

我正在使用 tolua++ 自动将 C++ 类型公开给 Lua。似乎当我暴露某种类型时,例如

struct TestComponent
{
   float foo;
   string bar;
}

tolua 所做的(至少在我看来是这样的)是向 lua 环境添加一个新的元表(在这种情况下,它只会被称为TestComponent)使用一些常规的元方法,例如__add, __lt, 以及__index,__newindex等。它还有一些自定义函数(称为.setand .get),当您获取或设置结构/类的某些成员时,它们似乎会被使用。这里的TestComponent 的类型似乎只是“table”。

但是,对于像上面这样的简单结构定义,它似乎缺少的是创建类型的新实例的函数/方法TestComponent,例如

a = TestComponent:new()

那么,问题是,如何创建这种类型的新实例并将其分配给变量?例如,将它交给一个需要 type 参数的函数TestComponent

4

1 回答 1

0

我使用 tolua++ 已经有几年了,但根据文档,如果你的结构有一个构造函数,那么你可以用a = TestComponent()or创建对象a = TestComponent:new()(两者都应该工作,除非你有旧版本的 tolua++)。在 C++ 结构中没有构造函数,文档没有说,但是根据您的陈述,它似乎TestComponent成为具有给定字段和关联值的常规表对象,在这种情况下,拥有一个构造函数(表是对象,你不能创建它的多个实例)。

因此,如果您可以编辑结构的 C++ 标头以向其添加构造函数,它可能会起作用。如果你不能这样做,那么你可以自己定义一个构造函数(注意:未经测试):

function TestComponent:new()
    local obj = {}
    for k,v in pairs(self) do 
        obj[k] = v
    setmetatable(obj, self)
    return obj
end

您可能必须过滤键,以便仅获取值(例如,不是函数),或者用显式分配替换循环,例如:

function TestComponent:new()
    local obj = {}
    obj.foo = self.foo
    obj.bar = self.bar
    setmetatable(obj, self)
    return obj
end
于 2014-07-04T02:15:55.877 回答