最近在看Luatinker的源代碼,打算自己改(仿寫)寫搞一個簡單的封裝C++和LUA的結合的庫,結果發現其實麻煩和困惑比想象的多。
比如這些點:
1)有時候使用模板的時候,引用會退化。
classtype &,經過模板參數后,會退化為class type,這個在LuaTinker的實現里面就有問題,你會發現tinker的引用就沒有起到作用。
這個我打算研究一下《C++模板》
2)基本(非object)類型(比如int)的應用和指針的使用問題?
因為大部分C++ to LUA的參數傳遞都是使用lua_pushnumber這類函數,這類函數肯定不會考慮什么引用問題的。而Luatinker在對於object類型,可以使用引用(當然他的引用其實無效,見問題1)和指針,但對於非object類型,LuaTinker沒有提供相應的方法幫助你,使用相關方法是在class_name的地方不會得到有效的類型名稱,而且Lua內部並沒有注冊這些基本類型的userdata,所以其實你用LuaTinker你其實不能使用基本類型的指針。
3)const的指針和引用沒有得到正確處理。
由於LuaTinker內部對於指針和引用的保存處理都是一個void *,所以其實LuaTinker並沒有考慮對於const的指針和引用應該如何處理,也就是是說,其實經過LuaTinker的綁定,其實會破壞const 的特性。LuaTinker對於類的metatable定義的修改函數,都是可以修改類的成員的。這其實挺煩人(危險)的。
4)Lua種如何使用指針或者引用?
把指針或者引用(引用其實還是只能包裝成指針)作為user data給Lua使用當然是可以的,但問題是Lua,至少是LuaTinker是不能自己直接創建一個指針(引用就先不扯淡了),當然你直接定義一個類型叫某某類的指針當然也可以。但大部分Lua的綁定庫沒有這樣惡心自己。如果Lua不能直接創建一個指針,那么你得到一個指針的方法就只剩下了依靠函數返回值了(你把指針綁定在某個table上(包括全局)使用,其實還是使用函數返回值)。
但確實是這樣嗎?
5)指針的指針,和指針的引用這樣的參數能使用嗎?
LuaTinker 應該沒考慮這類問題,呵呵。我考慮的是以Lua的機制,這種參數是不是也應該是沒有用處的。
所以是不是指針和引用其實只能在返回值上使用?這個和問題4異曲同工。
6)多重繼承的問題,
LuaTinker沒有考慮這個問題,當然這個問題不是無解,只是麻煩程度而已。
而且其實這部分問題不光是Luatinker一個人的問題,大部分C++和LUA綁定庫都有類似問題,比如Luabind,luaplus,tolua++等。
畢竟C++和Lua是兩種思路差別很大的語言,我目前的困惑還挺大的。看來只有慢慢來了。
【本文作者是雁渡寒潭,本着自由的精神,你可以在無盈利的情況完整轉載此文檔,轉載時請附上BLOG鏈接:http://www.cnblogs.com/fullsail/,否則每字一元,每圖一百不講價。對Baidu文庫和360doc加價一倍】
