2013-07-10 56 views
3

我試圖將我的std::map<std::string, std::string>作爲類屬性公開給Lua。我設置爲我的getter和setter這種方法:如何使用LuaBind將std :: map綁定到Lua

luabind::object FakeScript::GetSetProperties() 
{ 
    luabind::object table = luabind::newtable(L); 
    luabind::object metatable = luabind::newtable(L); 

    metatable["__index"] = &this->GetMeta; 
    metatable["__newindex"] = &this->SetMeta; 

    luabind::setmetatable<luabind::object, luabind::object>(table, metatable); 

    return table; 
} 

這樣,這讓我能夠做這樣的事在Lua:

player.scripts["movement"].properties["stat"] = "idle" 
print(player.scripts["movement"].properties["stat"]) 

但是,代碼我已經用C++提供沒有被編譯。它告訴我在此行metatable["__index"] = &this->GetMeta;和它後面的行有一個模糊的調用超載函數。我不確定我是否正確地做到了這一點。

錯誤消息:

error C2668: 'luabind::detail::check_const_pointer' : 
ambiguous call to overloaded function 
c:\libraries\luabind-0.9.1\references\luabind\include\luabind\detail\instance_holder.hpp 75 

這些SetMetaGetMetaFakeScript

static void GetMeta(); 
static void SetMeta(); 

以前我是做這行的getter方法:

luabind::object FakeScript::getProp() 
{ 
    luabind::object obj = luabind::newtable(L); 

    for(auto i = this->properties.begin(); i != this->properties.end(); i++) 
    { 
     obj[i->first] = i->second; 
    } 

    return obj; 
} 

這工作得很好,但它不讓我使用setter方法。例如:

player.scripts["movement"].properties["stat"] = "idle" 
print(player.scripts["movement"].properties["stat"]) 

在這段代碼中,它只是觸發兩行中的getter方法。雖然如果讓我使用setter,我將無法從這裏獲得["stat"]的屬性。

這裏有沒有LuaBind的專家?我見過大多數人說他們以前從未與之合作過。

+0

把你看到它的完整的錯誤信息,請在你的問題。 – greatwolf

+0

@greatwolf我把它。 – MahanGM

+0

錯誤應該顯示候選職能是什麼。 – greatwolf

回答

3

您需要使用(未記錄的)make_function()從函數中創建對象。

metatable["__index"] = luabind::make_function(L, &this->GetMeta); 
metatable["__newindex"] = luabind::make_function(L, &this->GetMeta); 

不幸的是,這make_function(最簡單的)過載被打破,但你只需要insert fmake_function.hpp第二個參數。

+0

其實我在這之前就試過了。由於超載的腐敗,我無法讓它工作,所以我把它扔掉了。現在你一直在幫助我!我會嘗試,但我想出了另一種使用函數重載來實現我的需求的方法。 – MahanGM