首页 > 解决方案 > 如何使 SWIG 绑定类在 Lua 中使用运算符?

问题描述

在这里,我有一个类Value,它可以简单地获取和设置float

class Value
{
public:
    Value(float f)
    :f(f){};
    float get()
    {
        return f;
    }
    void set(float f)
    {
        this->f = f;
    }
private:
    float f;
};

我希望我的班级能够像 Lua 中的以下示例一样工作。

local value = my.Value(3);
value = value * 2 - 1
if (value == 5) then
    print("succeed");
else
    print("failed");
end

它应该输出以下结果。

succeed

我应该如何纠正我的课程,以便我可以使用运算符?

标签: c++luaswigoperator-keyword

解决方案


您必须重载要使用的每个运算符,即operator*,operator+operator==。不幸的是,比较运算符不起作用,因为 Lua 仅__eq在比较中的两个操作数具有相同的元表时才考虑元方法。来自Lua 用户 wiki

__eq - 检查是否相等。当评估“myTable1 == myTable2”时调用此方法,但前提是两个表具有完全相同的 __eq 元方法。

您可以通过将比较中的另一个操作数包装到Value构造函数中来解决此问题。

%module my
%{
class Value
{
public:
    Value(float f) :f(f) {};
    Value operator*(float f) const {
        return this->f * f;
    }
    Value operator-(float f) const {
        return this->f - f;
    }
    bool operator==(Value const &rhs) const {
        return this->f == rhs.f;
    }
private:
    float f;
};
%}

class Value {
public:
    Value(float f);
    Value operator*(float f) const;
    Value operator-(float f) const;
    bool operator==(Value const &rhs) const;
};
local my = require("my")

local value = my.Value(3);
value = value * 2 - 1

if (value == my.Value(5)) then
    print("succeed");
else
    print("failed");
end

推荐阅读