你不能真正「獲得」一個Lua函數。 Lua函數,如Lua表,是純粹的Lua對象。因此,他們沒有C或C++模擬器。如果你想調用一個Lua函數,那是通過lua_call
,lua_pcall
或類似的函數完成的。這是在Lua棧上原位完成的。
所以你不能把一個Lua函數變成一個C++值。 可以做什麼是採取一個Lua函數和操縱它的各種方式,所有的Lua對象可以被操縱。
例如,假設您想要將一個Lua函數存儲在一個C++對象中,然後再調用其中存儲的Lua函數。顯然,你不能直接將Lua函數轉換爲C++值。 可以做的是將Lua函數存放在C++可以訪問的地方。你使用的有一個C++類似的值來存儲Lua函數。對於您想要存儲的每個對象,此值必須是唯一的。存儲對象時獲得的值將保存在C++對象中。當需要檢索Lua函數時,只需使用存儲的值來檢索它。
因爲這是一個非常普遍的操作,Lua有方法來促進這一點。首先是Lua註冊表,一個C++可以訪問的表格,但Lua代碼不能(除非您授予它訪問權限)。
第二個是luaL_ref
系列功能。 luaL_ref
將堆棧頂部的任何內容都粘貼到您提供的表格中,並返回給您一個整數鍵,以便稍後使用它來檢索它。 lua_rawgeti
可用於通過密鑰從表中檢索函數,luaL_unref
接受表和整數鍵,當您完成該操作時,從表中刪除引用的函數。
所以,如果你想存儲這樣的功能,你只需要創建一個這樣的表,將其粘貼在註冊表中的一個已知位置(以便您可以隨時獲取它),然後使用luaL_ref
來存儲這些功能。當它們打電話給他們時,用lua_rawgeti
檢索它們。當你完成使用它們時,用luaL_unref
銷燬它們。
將事情直接引用到註冊表中可能不是一個好主意。除非您的代碼是將在該Lua環境中執行的唯一C/C++代碼。 –
我一般同意,但在這種情況下,關鍵是保證是唯一的,我見過一些圖書館沒有問題(例如,winapi)。 OP可根據需要替換他們自己的表格。 –
它只保證是唯一的「只要你不手動添加整數鍵到表't'」。 –