2012-06-27 15 views
9

Come metaprogrammazione del C++ è funzionale: esiste un modo per fare qualcosa di paragonabile a qualsiasi costrutto del linguaggio let o where di un linguaggio di programmazione funzionale (ad esempio Haskell)?C++/Boost MPL: codice di struttura similarmente Haskell's let, dove,

Sto usando Boost :: MPL ma vorrei avere più struttura per metafunzioni più lunghe. La suddivisione in più funzioni va bene, ma preferirei lasciare/dove in alcuni casi.

+0

Arriva un punto in cui si cerca di calzascarpe più modello di magia in C++ smette di dare rendimenti utili, soprattutto quando si tratta di compatibilità futura e manutenzione. Hai considerato di scrivere più codice in un linguaggio funzionale veloce che può generare librerie richiamabili da C/C++? (Mi viene in mente OCaml) – Rook

+1

No, non l'ho considerato. Sto usando la meta-programmazione perché ho bisogno di fare qualcosa in fase di compilazione, non perché voglio scrivere codice funzionale. I miei pezzi di codice non sono così complessi. Ho solo pensato che se avessi usato la stessa funzione per tre volte in una metafunzione a 30 linee sarebbe bello usare una struttura. – user1034081

+0

In C++ 11, è possibile eseguire molte elaborazioni in fase di compilazione con 'constexpr' invece di modelli. – leftaroundabout

risposta

2

La stessa MPL non supporta le clausole let ma alcune delle librerie create su di esse funzionano. Un esempio è metamonad. Come suggerisce il nome, supporta anche altri concetti funzionali di livello superiore (monadi). Un grosso inconveniente è che metamonad non è una parte ufficiale della distribuzione Boost.

Per quanto riguarda le soluzioni alternative per MPL, suddividere le cose in funzioni e utilizzare più spazi dei nomi per raggrupparle e quindi importare il simbolo importante nel proprio spazio dei nomi di livello superiore è probabilmente la scelta migliore.

+0

Grazie per avermi indirizzato a quella libreria. Sembra essere quello che stavo cercando anche se non lo so ancora, se lo userò. Libreria extra, sembra magica, ... – user1034081

+1

@ user1034081 Un utente MPL si lamenta della magia;) – pmr

1

Boost.Phoenix ha un costrutto chiamato let che consente di dichiarare variabili locali in un contesto di funzione di ordine superiore. Penso che questo sia di alto livello come si arriva, però. È ancora runtime, non in fase di compilazione.

Dalla pagina collegata:

let(_x = 1, _y = ", World") 
[ 
    // _x here is an int: 1 

    let(_x = "Hello") // hides the outer _x 
    [ 
     cout << _x << _y // prints "Hello, World" 
    ] 
] 
+0

Secondo me, se vuoi scrivere un codice funzionale, dovresti usare un linguaggio funzionale. Sto solo cercando un let-construct perché la metaprogrammazione del modello è funzionale. – user1034081