Quando si dovrebbe usare la specializzazione del modello, se non per metaprogrammazione?

5

Quando usiamo le specializzazioni dei modelli per in C ++, se non per SFINAE o metaprogrammazione? type_traits , enable_if e altri dipendono molto da esso, ma sono più curioso di situazioni che sono usi più "ovvi" di template - algoritmi e oggetti agnostici di tipo

Si può facilmente creare un esempio artificiale di algoritmo che fa cose completamente diverse per tipi diversi, quindi mi piacerebbe limitare l'ambito a più scenari "reali". In particolare, devono essere soddisfatte le seguenti proprietà:

  1. Si può formulare un invariante di una versione generica del modello (quindi ha senso parlare di specializzazione ), e
  2. La versione specializzata non viola alcun invariante della versione generica (se lo fa, probabilmente è una cattiva specializzazione e dovrebbe invece essere creata una classe / funzione separata).

Ho tre esempi nella mia mente:

  • %codice%. È noto che ha un'interfaccia diversa dal generico std::vector<bool> ( 1 , 2 ) e quindi lo considero un cattivo esempio: non soddisfa la proprietà 2.
  • %codice%. Nonostante non abbia un'implementazione "generica", ha invariante "generico".
  • %codice%. Soddisfa entrambe le proprietà.

Questi esempi, tuttavia, mi sembrano molto specifici. Mi chiedo se sia possibile descrivere quando si dovrebbe usare la specializzazione del modello. Per esempio. "se hai un contenitore di tipo agnostico che ha un'implementazione strettamente migliore per un tipo specifico" è probabilmente vero, ma, ancora una volta, piuttosto specifico.

    
posta yeputons 05.03.2017 - 11:35
fonte

2 risposte

2

When one should use template specialization, if not for metaprogramming?

La cosa "classica", e anche quella che menzioni alla fine, è quella di affinare una determinata implementazione generica per uno specifico (set di) tipi.

L'esempio di Prime qui sarebbe "ottimizzazioni" di contenitori o algoritmi per tipi banali. (Vedi ad esempio std :: copy )

Per quanto ne so, non c'è nulla di ciò che posso dire: per alcuni tipi, una determinata versione specializzata sarà oggettivamente migliore, mantenendo tutti i requisiti della versione generica, quindi verrà implementata non appena necessario.

    
risposta data 25.03.2017 - 22:37
fonte
0

A un certo punto, alcune librerie standard C ++ contenevano specializzazioni dei contenitori per qualsiasi T *, rendendole involucri sottili attorno ai contenitori di void *.

Questo è stato fatto per ridurre la duplicazione del codice generata.

Alcuni linker moderni sono in grado di eliminare automaticamente questa duplicazione di codice, riducendo così la necessità di simili soluzioni.

    
risposta data 27.03.2017 - 11:12
fonte

Leggi altre domande sui tag