如何在LuaBridge中使用运算符

时间:2015-12-14 00:04:50

标签: c++ binding lua bind luabridge

我试图导出我的矢量类

            .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个操作符时,我有多个重载。如何指定我想使用哪一个,这是否可能?

3 个答案:

答案 0 :(得分:0)

如果函数重载int MyClass::Func(int)MyClass* MyClass::Func(MyClass),则可以按以下方式定义要使用的重载。在这个例子中,我选择使用MyClass* MyClass::Func(MyClass)作为重载。

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

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

答案 1 :(得分:0)

所以我只做了一个加/减/乘/除功能并调用它。猜猜运营商不想遵守。

答案 2 :(得分:0)

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

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

'equal'应该声明为:

bool A::equal( const A & )

然后:

if obj1 == obj2 then
end

'相等'将起作用!

但是如果你实现了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的子类!

希望它会对你有所帮助! 抱歉我的英语很差!