首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Luabridge绑定重载运算符

Luabridge绑定重载运算符
EN

Stack Overflow用户
提问于 2018-03-26 19:11:53
回答 1查看 315关注 0票数 2

我已经编写了一个简单的vec3类,它实现了*/+-运算符:

代码语言:javascript
复制
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绑定这些运算符,在某种程度上类似于:

代码语言:javascript
复制
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();

这样我就可以像这样调用lua中的函数:

代码语言:javascript
复制
onUpdate = function (e, dt)
    e.position = e.position + e.velocity * dt;
end

当我在vec3类的*操作符中放置一个断点时,它确实命中了断点,但是rhs浮点数是未定义的。

如果我将lua代码更改为:

代码语言:javascript
复制
    onUpdate = function (e, dt)
        e.position = e.position + e.velocity
    end

那么rhs vec3也是未定义的。所以看起来参数没有被正确传递。

然后,我将注册更改为:

代码语言:javascript
复制
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();

但是现在vec3的成员数据或浮点参数是未定义的。如果我越过这个断点,luabdridge会抛出以下异常:

代码语言:javascript
复制
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.

我能想到的唯一一件事就是我不知何故没有正确注册函数。

所以我的问题是:如何正确绑定运算符,并确保参数类型正确,以及如何在lua中正确调用它?

EN

回答 1

Stack Overflow用户

发布于 2018-03-27 02:40:48

因此,正如我在问题中所说,我怀疑注册工作是不正确的。我仍然不完全理解细节,但我怀疑函数指针类型转换以某种方式改变了调用约定,因此我将代码更改为:

代码语言:javascript
复制
.addFunction("__mul",&vec3::operator*);

而且它工作得很完美。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49490076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档