Я хочу создать класс с динамическими свойствами. Например:
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;
};
как я могу привязать этот класс к lua с luabind или mluabind для использования в 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 — имена переменных, которые я знаю только во время выполнения.
Вы можете сделать это с метатаблицами Lua.
Для каждой таблицы в Lua вы можете предоставить метатаблицу, которая может использоваться для перегрузки операторов таблицы, а также для доступа к ее элементам. Другими словами, его можно использовать для предоставления метода, который описывает, что должно происходить всякий раз, когда кто-то пытается получить доступ к элементу внутри таблицы. Увидеть Глава Metatables в ПИЛ, и, в частности, раздел «Метаметоды доступа к таблицам».
В вашем случае вы можете создать две функции C ++, которые обеспечат доступ на чтение и запись к вашему классу C ++. Затем вы можете связать их с Lua и перегрузить вашу таблицу Lua, чтобы она вызывала эти функции всякий раз, когда вы пытаетесь либо прочитать значение в таблице, либо записать значение в нее.
Других решений пока нет …