【问题标题】:How do I use operators in LuaBridge如何在 LuaBridge 中使用运算符
【发布时间】:2015-12-14 00:04:50
【问题描述】:

我正在尝试导出我的向量类

            .beginClass<Vector>("Vector")
            .addConstructor<void(*)()>()
            .addConstructor<void(*)(float, float, float)>()
            .addFunction("__eq", &Vector::operator==)
            .addFunction("__add", &Vector::operator+)
            .addData("x", &Vector::x)
            .addData("y", &Vector::y)
            .addData("z", &Vector::z)
            .addFunction("Length", &Vector::Length)
            .addFunction("Angle", &Vector::Angle)
            .addFunction("Distance", &Vector::DistTo)
        .endClass()

但是当我尝试执行其他 3 个运算符时,我对它们有多个重载。如何指定我想使用哪一个,这甚至可能吗?

【问题讨论】:

    标签: c++ binding lua bind luabridge


    【解决方案1】:

    如果您有一个函数重载int MyClass::Func(int)MyClass* MyClass::Func(MyClass),那么您可以定义重载以按以下方式使用。在此示例中,我选择使用 MyClass* MyClass::Func(MyClass) 作为重载。

    .addFunction("Func", (MyClass*(MyClass::*)(MyClass)) &MyClass::Func)
    

    所以这里发生的是函数签名提供了指向函数的指针。

    【讨论】:

    • 我试图用我的操作员来做这件事-但没有成功.addFunction("__sub", (Vector(Vector::*)(const Vector&amp;)) &amp;Vector::operator-)Vector Vector::operator-(const Vector&amp; v) const { return Vector(x - v.x, y - v.y, z - v.z); }
    • @Snorflake 尝试像这样添加 const:.addFunction("__sub", (Vector (Vector::* const)(const Vector&amp;)) &amp;Vector::operator-)
    • 还是什么都没有。没关系,我还是在下面发布了我的解决方案。
    【解决方案2】:

    所以我只是创建了一个加/减/乘/除函数并改为调用它。猜测运营商只是不想遵守。

    【讨论】:

    【解决方案3】:

    infect luabridge 可以这样实现, 如果你定义一个 A 类

    .addFunction("__eq", &A::equal )
    

    'equal' 应该声明为:

    bool A::equal( const A & )
    

    然后:

    if obj1 == obj2 then
    end
    

    'equal' 会起作用!

    但是如果你实现了一个 A 的子类 B类:公共A

    这会花费你很多时间!

    首先你必须专门化模板类或模板方法

    luabridge::UserdataValue 
    
    luabridge::UserdataPtr::push(lua_State* const L, T* const p)
    

    指定需要注册对象或指针的类(元)表

    你应该阅读 luabridge 的源代码来完成这个!

    那么!

    你应该把这个功能重新注册到B!

    .addFunction("__eq", &B::equal )
    

    lua 代码:

    local inst_a = app.new_class_A();
    local inst_b = app.new_class_B();
    -- this will call the '__eq' in B's metatable
    if( inst_b == inst_a )then
    end
    -- this will call the '__eq' in A's metatable
    if( inst_a == inst_b )then
    end
    

    调用__eq时,luabridge不会搜索类的父类的元数据表,所以你应该重新注册到A的子类!

    希望对您有所帮助! 对不起我的英语不好!

    【讨论】:

      猜你喜欢
      • 2018-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-12
      • 2011-05-30
      • 1970-01-01
      • 2018-09-16
      • 2019-08-18
      相关资源
      最近更新 更多