C++ Luabridge绑定重载运算符
我编写了一个简单的vec3类,它实现了*/+-运算符:C++ Luabridge绑定重载运算符,c++,lua,luabridge,C++,Lua,Luabridge,我编写了一个简单的vec3类,它实现了*/+-运算符: class vec3 { public: vec3(): x(0.0f),y(0.0f),z(0.0f) {} vec3(float ix, float iy, float iz): x(ix),y(iy),z(iz) {} vec3 operator+(const vec3& v){ vec3 vec(x+v.x,y+v.y,z+v.z); r
class vec3
{
public:
vec3():
x(0.0f),y(0.0f),z(0.0f)
{}
vec3(float ix, float iy, float iz):
x(ix),y(iy),z(iz)
{}
vec3 operator+(const vec3& v){
vec3 vec(x+v.x,y+v.y,z+v.z);
return vec;
}
vec3 operator-(const vec3& v){
vec3 vec(x-v.x,y-v.y,z-v.z);
return vec;
}
vec3 operator*(const float& s){
vec3 vec(x*s,y*s,z*s);
return vec;
}
vec3 operator/(const float& d){
flot div = 1.0f/d;
vec3 vec(x*div,y*div,z*div);
return vec;
}
float x, y, z;
};
我希望通过luabridge对这些运营商进行约束,其方式类似于:
getGlobalNamespace(L)
.beginClass<vec3>("vec3");
.addConstructor<void (*) (const float&, const float& const float&)>()
.addData ("x", &vec3::x)
.addData ("z", &vec3::z)
.addData ("z", &vec3::y)
.addFunction("__add",(vec3*(vec3::*)(vec3)) &vec3::operator+);
.addFunction("__sub",(vec3*(vec3::*)(vec3)) &vec3::operator-);
.addFunction("__mul",(vec3*(vec3::*)(float)) &vec3::operator*);
.addFunction("__div",(vec3*(vec3::*)(float)) &vec3::operator/);
.endClass();
当我在vec3类的*操作符中放置断点时,它确实命中了它,但rhs浮点未定义
如果我将lua代码更改为:
onUpdate = function (e, dt)
e.position = e.position + e.velocity
end
那么rhs vec3也未定义。因此,该参数的传递似乎不正确
然后我将注册更改为:
getGlobalNamespace(L)
.beginClass<vec3>("vec3");
.addConstructor<void (*) (const float&, const float& const float&)>()
.addData ("x", &vec3::x)
.addData ("z", &vec3::z)
.addData ("z", &vec3::y)
.addFunction("__add",(vec3*(vec3::*)(const vec3&)) &vec3::operator+);
.addFunction("__sub",(vec3*(vec3::*)(const vec3&)) &vec3::operator-);
.addFunction("__mul",(vec3*(vec3::*)(const float&)) &vec3::operator*);
.addFunction("__div",(vec3*(vec3::*)(const float&)) &vec3::operator/);
.endClass();
我能想到的唯一一件事是,我不知何故没有正确注册函数
所以我的问题是:
如何正确绑定运算符,并确保参数类型正确,以及如何在lua中正确调用它?因此,正如我在问题中提到的,我怀疑注册没有正确完成。我仍然不知道;我不能完全理解细节,但我怀疑函数指针强制转换以某种方式改变了调用约定,因此我将代码更改为:
.addFunction("__mul",&vec3::operator*);
而且它工作得很好。仅供参考,以防您没有注意到。Line.addData(“z”,&vec3::y)。这里也许应该是“y”。
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
.addFunction("__mul",&vec3::operator*);