In C ++, SFINAE e la metaprogrammazione erano intenzionali o solo un sottoprodotto di modelli?


11

SFINAE e templatemetaprogrammazione possono fare cose meravigliose e molte biblioteche le usano anche in modo considerevole.

Storicamente entrambi questi "concetti magici" sono stati introdotti / supportati intenzionalmente in C ++? O sono stati scoperti poco dopo come utili sottoprodotti (prodotti collaterali) della templateprogrammazione originale ?

Risposte:


19

Circa un decennio fa, dopo una giornata di conferenza, mi è capitato di trovarmi in un pub con Erwin Unruh e pochi altri e gli ho chiesto del programma menzionato da VJovic . Ormai abbiamo avuto un paio di birre, è stato un incontro non ufficiale, ed è vissuto nella mia testa per un decennio, quindi prendilo con un granello di sale, ma secondo i miei ricordi:

Ha detto che avevano aggiunto le funzionalità del modello per servire meglio l'STL. Secondo lui, alcuni / molti nel comitato sentivano che stavano creando qualcosa senza conoscerne le piene capacità. Lui stesso sospettava che tutte le cose del modello, specialmente una specializzazione così parziale, costituissero un linguaggio completo di Turing, e intendeva sempre farne una prova formale, ma non se ne andò mai.

Invece una notte in una riunione di standardizzazione ha escogitato quel programma che stampava numeri primi come messaggi di errore (una versione che dovrebbe funzionare con i compilatori moderni è qui ) che ha calcolato durante la compilazione. Come meta-programma modello non è molto impressionante per gli standard odierni, ma dopo tutto è stato il primo. Qualcuno ha fatto quello che considerava uno scherzo presentando formalmente il programma in modo che diventasse un documento ufficiale di standardizzazione ISO.

Ricordo di avergli specificamente chiesto della reazione di Bjarne Stroustrup al programma e, in risposta, Erwin lo imitò coprendosi gli occhi con la mano. :)

Con il senno di poi rimpiango di non aver chiesto a Todd Veldhuizen , che era anche lui a quella conferenza, come si è inventato i modelli di espressione . (Di certo è stato un tipo simpatico con cui parlare.) Ma ero molto più giovane e ho lasciato sfuggire l'occasione della vita.:(


+1, esperienza interessante. Hanno parlato di SFINAE allora?
iammilind,

@iammilind: Penso che SFINAE sia solo una delle caratteristiche che ha menzionato che sono state aggiunte per supportare meglio lo STL, sebbene il moniker "SFINAE" sia stato coniato solo anni dopo.
sabato

11

Nel 1994, durante una riunione del comitato di standardizzazione del c ++, E. Unruh ha scoperto che i modelli possono essere usati per calcolare qualcosa in fase di compilazione. Ha scritto un programma che stampa numeri primi. La parte interessante di questo esercizio è stata che la produzione dei numeri primi è stata eseguita dal compilatore durante il processo di compilazione e non in fase di esecuzione. Sebbene questo programma non fosse completamente portatile, il programma ha mostrato che il meccanismo di istanziazione del modello è un linguaggio ricorsivo primitivo che può eseguire calcoli non banali al momento della compilazione.

Questo estratto è tratto dai "modelli c ++" di Vandevoorde e Josuttis (capitolo 17).

Come puoi vedere, è stato scoperto presto e il suo potere è stato riconosciuto immediatamente.


2
Buona Questo tipo di articolo che ho letto anche su Internet, non ricordo la fonte. Questo vale anche per SFINAE?
iammilind,

@iammilind Cosa intendi con "È vero anche per SFINAE?"
BЈовић,

1
SFINAE generalmente necessita di supporto da parte del compilatore. Quindi è possibile che non sia stato scoperto per caso.
iammilind,

@iammilind Ho trovato un articolo di informit che ha un testo simile dal libro: informit.com/articles/article.aspx?p=30667&seqNum=8
BЈовић

@iammilind Ha modificato la risposta. Direi che è stato per caso, perché il supporto dei compilatori per i modelli era limitato. Il programma non era portatile e penso che abbia funzionato solo su un compilatore
BЈовић
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.