Ich habe eine Funktion, die das Dateisystem des Benutzers scannt, einen Vektor mit den Pfaden füllt und dann entweder sortiert oder nicht sortiert. Da der Benutzer in der Lage sein sollte, zur Kompilierzeit zu entscheiden, ob er den Vektor sortiert haben will oder nicht, verwende ich Templates und Hilfsklassen anstelle eines sehr gewünschten (aber nicht existierenden) "statischen if".
Betrachten Sie diesen Code:
%Vor%Der Code, den ich oben geschrieben habe, ist von GROSSARTIG vereinfacht , die mehrere Template-Parameter benötigt, damit der Benutzer die Ergebnisse der Funktion zur Kompilierungszeit noch weiter anpassen kann.
Gibt es eine Alternative zur Verwendung all dieser Hilfsklassen? Es wird sehr unordentlich und schwer zu lesen.
Idealerweise möchte ich folgendes schreiben:
%Vor% Da Ihr Wert zur Kompilierzeit bekannt ist (Nicht-Template-Typ-Parameter), können Sie perfekt ein "normales" if
:
Der Compiler führt konstante Faltung und Beseitigung von toten Codes aus (wenn diese Optimierungen natürlich aktiviert sind), und das Ergebnis ist genau das gleiche wie bei der Verwendung die hypothetische static_if
.
Ich fürchte, es gab ein Missverständnis bezüglich der Verwendung von static_if
.
Sicher kannst du static_if
(oder was immer du willst) versuchen, etwas Optimierung zu bekommen, aber das ist nicht das erste Ziel.
Das erste Ziel von static_if
ist semantisch . Lassen Sie mich das mit std::advance
demonstrieren. Eine typische Implementierung von std::advance
verwendet einen Typswitch, um zur Kompilierungszeit zwischen einer O (1) Implementierung (für Random Access Iteratoren) und einer O (n) Implementierung (für die anderen) zu wählen:
Und schließlich:
%Vor% Warum verwenden Sie in diesem Fall nicht nur if
? Weil es nicht kompilieren würde.
+=
--
nicht
Die only Methode zur Implementierung der Funktionalität besteht also darin, statisch nur unter Verwendung der verfügbaren Operationen für den angegebenen Typ an eine Funktion zu senden.
Tags und Links c++ c++11 templates static if-statement