我正在尝试使用 Luabridge 在 Lua 中实现 Vector3 类。到目前为止,我能够构建它,并像您期望的那样访问每个组件 (x, y, z)。Lua 中的示例如下所示:
local v = Vec3(0, 0, 0)
现在,我想重载算术运算符,从加法开始。我使用 glm 作为我的主干数学库,所以我只能访问他们定义的全局运算符 +。因此,我能够让它工作的唯一方法是使用 luabridge 的 addStaticFunction,目前我的类注册看起来像这样:
luabridge::getGlobalNamespace(L)
.beginClass<vec3>("Vec3")
.addConstructor<void(*)(f32, f32, f32)>()
.addProperty("x", &VecProperty<vec3, f32>::Get<0>, &VecProperty<vec3, f32>::Set<0>)
.addProperty("y", &VecProperty<vec3, f32>::Get<1>, &VecProperty<vec3, f32>::Set<1>)
.addProperty("z", &VecProperty<vec3, f32>::Get<2>, &VecProperty<vec3, f32>::Set<2>)
.addStaticFunction("__add", (vec3(*)(const vec3&, const vec3&)) & ::operator+)
.endClass();
但是,当我尝试使用它时,例如:
Vec3(0, 0, 0) + Vec3(1, 1, 1)
我得到以下异常:attempt to perform arithmetic on a userdata value
奇怪的是,如果我直接使用该函数,它就可以工作,例如:
Vec3.__add(Vec3(0, 0, 0), Vec3(1, 1, 1))
据我了解,在 Vec3 的元表中存在一个名为 __add 的函数,它也应该能够将其用于算术运算符。显然情况并非如此,但我找不到任何资源来解释还需要做什么才能使其正常工作。
我在这里看到过类似的问题:Luabridge binding 重载操作符
但是,在他的示例中,他可以访问非全局运算符,这是我的问题不同的地方。