我使用tolu++来自动将c++类型暴露给Lua。似乎当我暴露某些类型时,例如
struct TestComponent
{
float foo;
string bar;
}
tolua所做的(至少这对我来说是什么)是添加一个新的元表到lua环境(在这种情况下,它只是被称为TestComponent
)与一些常规的元方法,如__add
, __lt
,以及__index
, __newindex
,等。它还有一些自定义函数(称为.set
和.get
),当您获取或设置结构/类的某些成员时,似乎会使用这些函数。这里TestComponent的类型似乎只是"table"。
TestComponent
类型的新实例的函数/方法,例如
a = TestComponent:new()
那么,问题是,如何创建这种类型的新实例并将其赋值给变量?例如,将其传递给需要TestComponent
类型参数的函数。
我使用tolua++已经有几年了,但是根据文档,如果您的结构有构造函数,那么您可以使用a = TestComponent()
或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