2010-04-15 111 views
4

我們使用tolua ++爲C++類生成Lua綁定。如何確定C++ usertype是否已使用tolua註冊

假設我有一個C++類:

class Foo 
{ 
    //Some methods in Foo, irrelevant to question. 
}; 

,並具有下列內容的tolua pkg文件

class Foo 
{ 
}; 

考慮以下功能:

void call_some_lua_function(lua_State* luaState) 
{ 
    Foo* myFoo = new Foo(); 
    tolua_pushusertype(luaState, (void*)myFoo, "Foo"); 

    //More code to actually call Lua, irrelevant to question. 
} 

現在,實際問題:

如果第三個參數不對應於通過調用tolua_cclass註冊的C++類的有效完全限定字符串,tolua_pushusertype會在Lua中導致段錯誤。所以,如果參數3在「Bar」中,我們得到一個段錯誤。

我想什麼做的是以下幾點:

void call_some_lua_function(lua_State* luaState) 
{ 

    //determine if tolua is aware of my type, how to do this? 
    //Something like: 
    //if(!tolua_iscpptype_registered("Foo")) 
    //{ 
    // abort gracefully 
    //} 

    Foo* myFoo = new Foo(); 
    tolua_pushusertype(luaState, (void*)myFoo, "Foo"); 

    //More code to actually call Lua, irrelevant to question. 
} 

有沒有辦法做到這一點使用tolua?

回答

1

我正在使用tolua,而不是tolua ++,但我們希望它有點類似。在tolua,你可以測試類是像這樣用它註冊:

tolua_getmetatable(L, "ClassName"); 
if (lua_isnil(L, -1)) { 
    // the class wasn't found 
} 

提示:檢查如何tolua.cast實現並檢查它的參數。它將一個類型名稱作爲字符串。

編輯:更好奇,我下載了tolua ++源文件,看了看裏面。它看起來不完全相似,並且缺少關鍵功能。我得給你一個未經測試的建議,可能的工作:

luaL_getmetatable(L, "ClassName"); 
if (lua_isnil(L, -1)) { 
    // the class wasn't found 
} 

tolua和tolua的區別++似乎B中tolua使用「命名空間」,其創建的元表(「tolua。」前綴)。

+0

確實有效(第二版)。謝謝。 – czuger 2010-04-19 19:12:55

0

我只是一個lua初學者,因此我的建議是:將你的tolua-calls包裝在你自己的函數中,該函數跟蹤通過它註冊的類。現在你可以問你的包裝,如果tolua知道你的課程。

相關問題