2013-05-26 3 views
2

Я хочу создать класс с динамическими свойствами. Например: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; 
}; 

как я могу связать этот класс 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 - имена переменных, которые я знаю только во время выполнения.

ответ

0

Вы можете сделать это с помощью метаданных Lua.

Для каждой таблицы в Lua вы можете предоставить метатет, который представляет собой таблицу, которая может использоваться для перегрузки операторов таблицы, а также как она получает доступ к ее членам. Другими словами, его можно использовать для предоставления метода, который описывает, что должно происходить всякий раз, когда кто-либо пытается получить доступ к члену внутри таблицы. См. Раздел Metatables chapter in PIL и его раздел «Метаданные для доступа к таблице».

В вашем случае вы можете создать две функции C++, которые обеспечат чтение и запись на ваш класс C++. Затем вы можете привязать их к Lua и перегрузить таблицу Lua, чтобы она вызывала эти функции всякий раз, когда вы пытались либо прочитать значение, находящееся в таблице, либо записать в нее значение.

Смежные вопросы