8

Nehmen wir zum Beispiel das Argument an, dass eine effizientere Implementierung (Speichern, Operationen darauf) für einen Vektor ganzzahliger Typen gefunden wird (im Vergleich zur generischen Vektorimplementierung). Kann eine standardkonforme Bibliothek so etwas wie:Kann eine Standardbibliotheksimplementierung Standardtypen spezialisieren?

template <class T, class A, class Enable = void> 
class vector { ... }; 

template <class T> 
class vector<T, A, std::enable_if_t<std::is_integral<T>::value>> { ... }; 

Ich denke, dass dies wegen der zusätzlichen Vorlage Parameter illegal wäre.

Aber was ist ein wenig Compiler Magie: (abgesehen von der zusätzlichen Umsetzungsarbeit) würde so etwas erlaubt sein:

  • vector<integral_type, A>intern während
  • vector<anything_else, A>-class vector_integral<T, A> abgebildet zu sein zu sein intern zugeordnet zu class vector<T, A>.

- Das ist natürlich nicht über Spezialisierungen in der Norm ausdrücklich erwähnt, wie std::vector<bool>

- Die Spezialisierung offensichtlich die gleiche Schnittstelle und beobachtbares Verhalten würde.

- Lassen Sie uns concepts ignorieren, da sie noch nicht Standard sind. Es sei denn, du hast ein paar Fakten.

- Dies ist eine reine akademische Frage (lesen persönliche Neugier).

Antwort

1

Solange die Implementierung der Standardbibliothek den Garantien des Standards entspricht, können Spezialisierungen vorgenommen werden. Diese Garantien umfassen offensichtlich die Komplexität des Wachstums, Schnittstellenfunktionen und für bestimmte Klassen das interne Layout der Daten.

Die Spezialisierung vector<bool> ist meines Wissens im Standard enthalten, da sich ihr internes Datenlayout von der generischen Bibliotheksklasse vector<T> unterscheidet. Daher muss sie vom Standard ausdrücklich zugelassen werden.

Der Standard sagt explizit 17.5.1.4 ad. 7:

:

Die in den Bibliotheksklauseln angegebenen Komplexitätsanforderungen sind obere Grenzen und Implementierungen, die höhere Komplexitätsgarantien bieten, erfüllen die Anforderungen.