C ++ Template-Metaprogrammierung, "static if" -Work-around - kann es verbessert werden?

7

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%     
Vittorio Romeo 10.06.2013, 13:14
quelle

3 Antworten

17

Da Ihr Wert zur Kompilierzeit bekannt ist (Nicht-Template-Typ-Parameter), können Sie perfekt ein "normales" if :

schreiben %Vor%

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 .

    
syam 10.06.2013, 13:20
quelle
11

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:

%Vor%

Und schließlich:

%Vor%

Warum verwenden Sie in diesem Fall nicht nur if ? Weil es nicht kompilieren würde.

  • ein bidirektionaler Iterator unterstützt nicht +=
  • ein Eingabe-Iterator (oder Vorwärts-Iterator) unterstützt -- 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.

    
Matthieu M. 10.06.2013 14:27
quelle
0

Was ist mit Template-Spezialisierung?

%Vor%

Bearbeiten: Ich bin ein Idiot.

    
Tim 10.06.2013 20:03
quelle