2015-08-03 8 views
7

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

+0

Che ne dici di esporre quella lezione con qualche setter e getter? –

+0

@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

+0

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

risposta

0

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.

+0

L'OP sta esponendo il codice da una libreria diversa a Lua: è improbabile che abbiano la possibilità di modificare la libreria di terze parti. – Yakk

+0

@Yakk Ecco perché hanno bisogno di generare un wrapper – Alice

1

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!