La migliore introduzione alla metaprogrammazione dei modelli C ++? [chiuso]


112

La metaprogrammazione statica (nota anche come "metaprogrammazione dei modelli") è una grande tecnica C ++ che consente l'esecuzione di programmi in fase di compilazione. Una lampadina si è spenta nella mia testa non appena ho letto questo esempio canonico di metaprogrammazione:

#include <iostream>
using namespace std;

template< int n >
struct factorial { enum { ret = factorial< n - 1 >::ret * n }; };

template<>
struct factorial< 0 > { enum { ret = 1 }; };

int main() {
    cout << "7! = " << factorial< 7 >::ret << endl; // 5040
    return 0;
}

Se si vuole saperne di più sulla metaprogrammazione statica C ++, quali sono le migliori fonti (libri, siti web, corsi on-line, qualunque cosa)?


43
la lampadina si è "spenta" o "accesa"?
horseyguy

36
Spento. Decisamente fuori.
Thomas Eding

Risposte:


108

[Rispondendo alla mia domanda]

Le migliori introduzioni che ho trovato finora sono il capitolo 10, "Metaprogrammazione statica in C ++" da Programmazione generativa, metodi, strumenti e applicazioni di Krzysztof Czarnecki e Ulrich W. Eisenecker, ISBN-13: 9780201309775; e il capitolo 17, "Metaprogrammi" dei modelli C ++: la guida completa di David Vandevoorder e Nicolai M. Josuttis, ISBN-13: 9780201734843.

testo alternativo testo alternativo testo alternativo testo alternativo

Todd Veldhuizen ha un eccellente tutorial qui .

Una buona risorsa per la programmazione C ++ in generale è Modern C ++ Design di Andrei Alexandrescu, ISBN-13: 9780201704310. Questo libro combina un po 'di metaprogrammazione con altre tecniche di template. Per la metaprogrammazione in particolare, vedere le sezioni 2.1 "Asserzioni in fase di compilazione", 2.4 "Mappatura delle costanti integrali ai tipi", 2.6 "Selezione del tipo", 2.7 "Rilevamento di convertibilità ed ereditarietà in fase di compilazione", 2.9 " NullTypee EmptyType" e 2.10 "Tratti di tipo ".

La migliore risorsa intermedia / avanzata che ho trovato è C ++ Template Metaprogramming di David Abrahams e Aleksey Gurtovoy, ISBN-13: 9780321227256

Se preferisci un solo libro, procurati i modelli C ++: la guida completa poiché è anche il riferimento definitivo per i modelli in generale.


2
Il collegamento al pezzo di Todd Veldhuizen è diventato obsoleto.
John R. Strohm


1
collegamento corretto ora, grazie!
jwfearn

Il collegamento è di nuovo interrotto!
Paul

1
Grazie @jwfearn, ho letto l'articolo, anche se l'ho trovato più interessante: youtube.com/watch?v=Am2is2QCvxY (ha due parti). È un discorso di Walter E. Brown: Modern Template Metaprogramming: A Compendium
Paul

24

Il libro Modern C ++ Design di Andrei Alexandrescu copre molti di questi e altri trucchi per un codice C ++ moderno veloce ed efficiente ed è la base per la libreria Loki .

Vale anche la pena menzionare le librerie Boost , che utilizzano pesantemente queste tecniche e di solito sono di altissima qualità da cui apprendere (anche se alcune sono piuttosto dense).


12

Modern C ++ Design , un libro brillante e un framework di design pattern di Alexandrescu. Un avvertimento, dopo aver letto questo libro ho smesso di fare C ++ e ho pensato "Diamine, posso solo scegliere un linguaggio migliore e ottenerlo gratuitamente".


5
"Che diamine, posso solo scegliere una lingua migliore e ottenerla gratuitamente" Ummm, cosa intendi? Sono particolarmente confuso da "gratis". E quale altra lingua avevi in ​​mente?
Pop Catalin,

12
La metaprogrammazione dei modelli C ++ ti offre tutti i tipi di nuove funzionalità come il passaggio di tipi o elenchi di tipi come argomenti, ecc. La maggior parte di queste funzionalità sono presenti in linguaggi tipizzati dinamicamente come Python, con una sintassi migliore.
Florian Bösch

1
Se stai cercando un linguaggio in cui scrivere rapidamente programmi corretti, Python è migliore di C ++. Se hai bisogno di alcune delle altre cose fornite da C ++, aggiungere funzionalità simili a Lisp a C ++ potrebbe essere meglio che provare a C ++, se con un altro linguaggio.
David Thornley

6

Due buoni libri che mi vengono in mente sono:

  • Design moderno C ++ / Andrei Alexandrescu (in realtà ha 7 anni nonostante il nome!)
  • Modelli C ++: la guida completa / Vandevoorde & Josuttis

È un campo abbastanza approfondito, quindi un buon libro come uno di questi è decisamente consigliato sui siti web. Alcune delle tecniche più avanzate ti faranno studiare il codice per un po 'di tempo per capire come funzionano!


5

Il C ++ moderno è una delle migliori introduzioni che ho letto. Copre esempi utili reali di metaprogrammazione di modelli. Dai un'occhiata anche alla libreria complementare Loki .


5

Non ci sarà un lungo elenco di libri, poiché l'elenco di persone con molta esperienza è limitato. La metaprogrammazione dei modelli è iniziata per davvero intorno al primo workshop sulla programmazione dei modelli in C ++ nel 2000 e molti degli autori citati finora hanno partecipato. (IIRC, Andrei no.) Questi pionieri influenzarono notevolmente il campo, e fondamentalmente ciò che dovrebbe essere scritto è ora scritto. Personalmente, consiglierei Vandevoorde e Josuttis. Quello di Alexandrescu è un libro difficile se sei nuovo nel campo.


4

I documenti originali di Veldhuizen erano buoni. Se desideri un intero libro, allora c'è il libro di Vandevoorde "Guida completa ai modelli C ++". E quando sei pronto per il corso di master, prova il Modern C ++ Design di Alexandrescu.


4

google Alexandrescu, Modern C ++ Design: programmazione generica e modelli di progettazione applicati

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.