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à:
- Si può formulare un invariante di una versione generica del modello (quindi ha senso parlare di specializzazione ), e
- 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.