我如何在 LuaBridge 中使用运算符
How do I use operators in LuaBridge
我正在尝试导出我的载体 class
.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 个运算符时,我对它们有多个重载。我怎样才能指定我想使用哪一个,这甚至可能吗?
如果您有函数重载 int MyClass::Func(int)
和 MyClass* MyClass::Func(MyClass)
,那么您可以按以下方式定义要使用的重载。在此示例中,我选择使用 MyClass* MyClass::Func(MyClass)
作为重载。
.addFunction("Func", (MyClass*(MyClass::*)(MyClass)) &MyClass::Func)
所以这里发生的是函数签名提供了指向函数的指针。
所以我只是创建了一个 add/subtract/multiply/divide 函数并调用了它。我猜运营商只是不想遵守。
infect luabridge 可以这样实现,
如果你定义一个 class A
.addFunction("__eq", &A::equal )
'equal' 应该这样声明:
bool A::equal( const A & )
然后:
if obj1 == obj2 then
end
'equal' 可以!
但是如果你实现 A 的子 class
class B : public A
这会花费你很多时间!
首先你必须专业化模板class或模板方法
luabridge::UserdataValue
luabridge::UserdataPtr::push(lua_State* const L, T* const p)
指定您需要注册对象或指针的class的(元)table
你应该阅读 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不会搜索class的parent的元数据table,所以你应该重新注册到A的subclass!
希望对您有所帮助!
抱歉我的英语不好!
我正在尝试导出我的载体 class
.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 个运算符时,我对它们有多个重载。我怎样才能指定我想使用哪一个,这甚至可能吗?
如果您有函数重载 int MyClass::Func(int)
和 MyClass* MyClass::Func(MyClass)
,那么您可以按以下方式定义要使用的重载。在此示例中,我选择使用 MyClass* MyClass::Func(MyClass)
作为重载。
.addFunction("Func", (MyClass*(MyClass::*)(MyClass)) &MyClass::Func)
所以这里发生的是函数签名提供了指向函数的指针。
所以我只是创建了一个 add/subtract/multiply/divide 函数并调用了它。我猜运营商只是不想遵守。
infect luabridge 可以这样实现, 如果你定义一个 class A
.addFunction("__eq", &A::equal )
'equal' 应该这样声明:
bool A::equal( const A & )
然后:
if obj1 == obj2 then
end
'equal' 可以!
但是如果你实现 A 的子 class class B : public A
这会花费你很多时间!
首先你必须专业化模板class或模板方法
luabridge::UserdataValue
luabridge::UserdataPtr::push(lua_State* const L, T* const p)
指定您需要注册对象或指针的class的(元)table
你应该阅读 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不会搜索class的parent的元数据table,所以你应该重新注册到A的subclass!
希望对您有所帮助! 抱歉我的英语不好!