Ich möchte eine sortierte Ansicht von std::vector<std::chrono::milliseconds>
, aber ich möchte den ursprünglichen Container nicht ändern. std::reference_wrapper
scheint dafür perfekt und es funktioniert gut für einen Vektor von ganzen Zahlen.
Ich habe dieses kleine Beispiel erstellt:
%Vor% Was die erwartete Ausgabe erzeugt (außer dass sorted_durations
natürlich nicht sortiert ist, da dies auskommentiert ist):
Wie Sie sehen, ist der ursprüngliche Vektor von Ganzzahlen numbers
durch die Sortieroperation von sorted_numbers
unverändert - genau das möchte ich auch für den sorted_durations
Vektor. Aber wenn ich diese Zeile auszeichne, wird mein Compiler sehr böse mit mir und ich muss zugeben, dass ich nicht herausfinden kann, was es mir zu sagen versucht.
Mein Compiler ist clang ++ Version 3.8 und ich baue das Beispielprogramm so:
Und hier ist die Fehlerausgabe, die ich bekomme:
%Vor%Es geht tatsächlich etwas länger, aber stackoverflow lässt mich nicht alle 55000 Zeichen des Fehlers posten.
Kann mir bitte jemand erklären, was ich falsch mache oder warum das einfach nicht möglich ist (wenn das der Fall ist)?
Der erste Fehler scheint ziemlich klar zu sein:
%Vor% Sie können <
nicht verwenden, um zwei reference_wrapper<duration<...>>
-Objekte zu vergleichen.
Die Konvertierung in duration<...>
erfolgt nicht, weil (wie oben erwähnt) operator<
für duration
eine Funktionsvorlage ist und ihre Argumente nicht aus reference_wrapper<duration<...>>
abgeleitet werden können.
Wenn Sie eine Instanz von std::less<std::chrono::milliseconds>
an std::sort
übergeben haben, würde dies dazu führen, dass die Wrapper in die Durationstypen konvertiert und korrekt verglichen werden.
Dies bedeutet grundsätzlich, dass Sie die Objekte sortieren möchten, indem Sie sie als milliseconds
nicht reference_wrapper<milliseconds>
vergleichen.
Per @ Nialls Vorschlag, dass Sie lambda
als Vergleich für sort()
verwenden können:
Tags und Links c++ c++11 reference-wrapper