c++ - 如何使 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
我应该如何纠正我的课程,以便我可以使用运算符?
解决方案
您必须重载要使用的每个运算符,即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
推荐阅读
- python - 计算熊猫列中的字符
- python - 我可以拆分熊猫行中的值进行搜索吗?
- javascript - 带有 Javascript 的替换功能的意外正则表达式输出
- unity3d - 在 Unity 2D 中,如何实现不会“物理”移动刚体的非触发碰撞?
- phpseclib - phpseclib wordpress 集成不起作用
- python - 比较忽略python中尾随空格的文件
- ruby - Ruby - 在新行中追加数据而不引入空行
- java-8 - maven shade-plugin 是我的 jar 无法在服务器中工作的罪魁祸首吗
- sql - 需要 PL/SQL 存储过程将列转换为行
- c - 通过链表在结构的成员中输入值