c++ - Luabridge 绑定(bind)重载运算符

标签 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);
        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 以类似于以下的方式绑定(bind)这些运算符:

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 中的函数:

onUpdate = function (e, dt)
    e.position = e.position + e.velocity * dt;
end

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

如果我把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();

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

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.

我唯一能想到的是我没有正确注册函数。

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

最佳答案

所以正如我在问题中提到的,我怀疑注册没有正确完成。我仍然不完全理解细节,但我怀疑函数指针转换以某种方式改变了调用约定,所以我将代码更改为:

.addFunction("__mul",&vec3::operator*);

而且效果很好。

关于c++ - Luabridge 绑定(bind)重载运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49490076/

相关文章:

c++ - type_info 尝试引用已删除的函数

lua - 使用 Lua 进行 Web 开发?

lua - 您如何正确使用带有 lua 的管道来获取程序的输出?

lua - 如何覆盖 Lua 类中元表的 __tostring?

c++ - LuaBridge 回调(将 lua 函数传递给 c++)

c++ - 为什么我们在多态性中使用指针?

c++ - 使用无捕获 lambda 表达式作为条件运算符的第二个和第三个操作数时出现 MSVC 错误

c++ - 为对基础对象进行操作的函数提供派生对象数组

c++ - 无法获取 Lua 函数来引用 'self'

c++ - 如何将 Lua 用户数据转换为 C++ 类对象?