2013-05-26 86 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; 
}; 

我怎麼能結合這個類luabind到Lua或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 metatables做到這一點。

對於Lua中的每個表,您可以提供一個metatable,它是一個可用於重載表的運算符的表以及它如何訪問其成員。換句話說,它可以用來提供一種描述當有人試圖訪問表中的成員時應該發生什麼的方法。特別參見Metatables chapter in PIL及其「表訪問Metamethods」部分。

對於您的情況,您可以創建兩個C++函數,它們將爲您的C++類提供讀取和寫入訪問權限。然後,您可以將它們綁定到Lua中,並且重載您的Lua表,以便在您試圖讀取表中的值或向其中寫入值時調用這些函數。