Luabind和动态属性

我想创建一个具有动态属性的类。例如:

class MyClass
{
public:
    int GetValue(string str)
    {
        return smap[str];
    }
    void SetValue(string str, int i)
    {
        smap[str] = i;
    }

private:

    std::map<string, int> smap;
};

如何使用 luabind 或 mluabind 将此类绑定到 lua,以便在 Lua 中像这样使用:

local myclass a;
a.var1 = 5;
a.var2 = 10;
print(a.var1, a.var2);

而不是像这样:

local myclass a;
a.SetValue("var1", 5);
a.SetValue("var2", 10);
print(a.GetValue("var1"), a.GetValue("var2"));

var1,var2 - 变量名称仅在运行时可知。

点赞
用户1549314
用户1549314

你可以使用 Lua 元表来实现这一点。

对于 Lua 中的每个表,都可以提供一个元表,即一个可用于重载表的运算符以及访问其成员的表。换句话说,它可以用于提供一个方法来描述每当有人尝试访问表内成员时应该发生什么。请参见 PIL 中的 Metatables 章节,特别是其中的“Table-Access Metamethods”一节。

在您的情况下,您可以创建两个 C++ 函数,用于提供对 C++ 类的读取和写入访问。然后,您可以将它们绑定到 Lua 中,并重载 Lua 表,以便每当您尝试读取表中的值或将值写入其中时,它都会调用这些函数。

2013-05-26 13:18:43