Per un progetto su cui sto lavorando, ho bisogno di esporre alcune classi C++ in un'altra libreria a Lua. Sfortunatamente, una delle classi più importanti di questa libreria ha un sacco di Unions ed Enums (the sf::Event class from SFML), e da un quick Google search ho scoperto che non c'è nulla sull'esporre le Unioni C++ a Lua. Non mi interessa se viene esposto con l'API Lua/C, con una libreria o con un generatore di binding, a patto che funzioni. Ma preferirei non usare un generatore di binding, perché voglio essere in grado di creare un oggetto in C++, quindi esporre quell'istanza dell'oggetto a Lua (a meno che non sia possibile con un generatore di binding)Come esporre i join C++ a Lua
risposta
Se tu sono disposti ad usare boost :: variant piuttosto che union, puoi provare ad usare la mia libreria LuaCast.
Proverò ad aggiungere anche i sindacati come tipo base.
Per registrare le funzioni C/C++ è necessario prima fare la vostra funzione sguardo come un modello di funzione C standard che Lua prevede:
extern "C" int MyFunc(lua_State* L)
{
int a = lua_tointeger(L, 1); // First argument
int b = lua_tointeger(L, 2); // Second argument
int result = a + b;
lua_pushinteger(L, result);
return 1; // Count of returned values
}
Ogni funzione che deve essere registrato in Lua dovrebbe seguire questo modello. Tipo di reso int
, parametro singolo lua_State* L
. E il conteggio dei valori restituiti. Quindi, è necessario registrarlo nella tabella registro di Lua in modo da poter esporre al contesto del vostro script:
lua_register(L, "MyFunc", MyFunc);
Per la registrazione variabili semplici è possibile scrivere questo:
lua_pushinteger(L, 10);
lua_setglobal(L, "MyVar");
Dopo di che, si' Riuscire a chiamare la propria funzione da uno script Lua. Tieni presente che dovresti registrare tutti i tuoi oggetti prima di eseguire qualsiasi script con lo stato di Lua specifico che hai usato per registrarli.
In Lua:
print(MyFunc(10, MyVar))
Risultato:
Credo che questo potrebbe aiutare!
Che ne dici di esporre quella lezione con qualche setter e getter? –
@Calvin Nel mio caso (esponendo sf :: Event), questa è una soluzione molto complicata perché coinvolge un sacco di getter con un sacco di istruzioni if. Ho anche avuto problemi con i getters per sf :: Event e la libreria che sto usando. Ma cercherò di provarlo con un'altra libreria/con l'API Lua/C. – Orfby
Sei rimasto bloccato su questo per un po '. Hai già imparato l'API C? Conoscete bene i metaboli Lua? È relativamente semplice se si capisce come funzionano userdata e metatables. Ecco un [post correlati] (http://stackoverflow.com/questions/31484773/call-c-functions-in-an-active-program-from-lua/31486050#31486050). – Mud