Quali sono i punti positivi e negativi dei modelli C++?

Quali sono i punti positivi e negativi dei modelli C++?

I modelli sono un meccanismo molto potente che può semplificare molte cose. Tuttavia, per utilizzarli correttamente richiede molto tempo ed esperienza, al fine di decidere quando il loro utilizzo è appropriato.

Per me i vantaggi più importanti sono:

  • riducendo la ripetizione del codice (contenitori generici, algoritmi)
  • riducendo la ripetizione del codice avanzato (MPL e Fusion)
  • polimorfismo statico (=prestazioni) e altri calcoli del tempo di compilazione
  • progettazione basata su criteri (flessibilità, riutilizzabilità, modifiche più semplici, ecc.)
  • aumento della sicurezza a costo zero (ad es. analisi dimensionale tramite Boost Units, asserzioni statiche, verifiche concettuali)
  • Programmazione funzionale (Phoenix), valutazione pigra, modelli di espressioni (possiamo creare linguaggi incorporati specifici del dominio in C++, abbiamo un'ottima libreria Proto, abbiamo Blitz++)
  • altri strumenti e trucchi meno spettacolari usati nella vita di tutti i giorni:
    • STL e gli algoritmi (qual è la differenza tra for e for_each )
    • bind, lambda (o Phoenix) (scrivi un codice più chiaro, semplifica le cose)
    • Funzione Boost (facilita la scrittura delle richiamate)
    • tuple (come eseguire l'hashing generico di una tupla? Usa Fusion per esempio...)
    • TBB (parallel_for e altri STL come algoritmi e contenitori)
  • Riesci a immaginare C++ senza modelli? Sì, posso, nei primi tempi non potevi usarli a causa delle limitazioni del compilatore.
  • Scriveresti in C++ senza modelli? No, poiché perderei molti dei vantaggi sopra menzionati.

Svantaggi:

  • Tempo di compilazione (ad esempio, inserisci Sprit, Phoenix, MPL e un po' di Fusion e puoi andare a prendere un caffè)
  • Persone che possono utilizzare e comprendere i modelli non è così comune (e queste persone sono utili)
  • Persone che pensano di poterlo fare l'uso e la comprensione dei modelli sono abbastanza comuni (e queste persone sono pericolose, poiché possono trasformare in un inferno il tuo codice. Tuttavia, la maggior parte di loro dopo un po' di istruzione/mentoring si unirà al gruppo menzionato nel punto precedente)
  • modello export supporto (mancanza di)
  • I messaggi di errore potrebbero essere meno criptici (dopo aver appreso puoi trovare quello che ti serve, ma comunque...)

Consiglio vivamente i seguenti libri:

  • Modelli C++:la guida completa di David Vandevoorde e Nicolai Josuttis (introduzione approfondita all'argomento dei modelli)
  • Progettazione C++ moderna. Programmazione generica e modelli di progettazione applicati da Andrei Alexandrescu (qual è il modo meno noto di utilizzare i modelli per semplificare il codice, rendere più facile lo sviluppo e ottenere un codice resistente alle modifiche)
  • Metaprogrammazione di modelli C++ di David Abrahms e Aleksey Gutov (di nuovo - modo diverso di utilizzare i modelli)
  • Altri modi di dire C++ da Wikibooks presentano alcune belle idee.

Sul lato positivo, i modelli C++:

  • Consenti la generalizzazione del tipo

  • Riduci la quantità di codice ridondante che devi digitare

  • Aiuta a creare codice type-safe

  • Vengono valutati in fase di compilazione

  • Può aumentare le prestazioni (in alternativa al polimorfismo)

  • Aiuta a creare librerie molto potenti

Sul lato negativo:

  • Può complicarsi rapidamente se non si sta attenti

  • La maggior parte dei compilatori fornisce messaggi di errore criptici

  • Può essere difficile usare/debug di codice altamente basato su modelli

  • Avere almeno una stranezza sintattica (l'operatore>> può interferire con i modelli)

  • Aiuta a rendere C++ molto difficile da analizzare

Tutto sommato, è necessario considerare attentamente quando utilizzare i modelli.


I miei 2c sono piuttosto negativi.

..