Ich habe ein Projekt, das derzeit C ++ 11/14 verwendet, aber es erfordert so etwas wie std::filesystem
, das nur in C ++ 17 verfügbar ist, und daher habe ich keine Chance, es derzeit zu verwenden. Ich sehe jedoch, dass es in meinem aktuellen Compiler als verfügbar ist std::experimental::filesystem
. Ist es eine gute Idee, experimentelle Funktionen zu verwenden, vorausgesetzt, ich könnte in Zukunft etwas hinzufügen wie:
#ifdef CXX17 //if this is C++17
std::filesystem::something ...;
#else
std::experimental::filesystem::something ...;
#endif
Meine Bedenken sind:
1. Ist garantiert, dass alle kompatiblen Compiler die gleichen experimentellen Funktionen haben?
2. Sind experimentelle Merkmale anfällig für große Änderungen, die sie unzuverlässig machen?
Vielleicht gibt es noch mehr Dinge, über die man sich wundern muss. Warum sollte ich sie benutzen oder nicht? Ich bin verwirrt über ein neues Projekt und weiß nicht, was ich entscheiden soll.
quelle
#idef CXX17
. IMHO besteht die tragbare Möglichkeit darin, den gesamten dateisystembezogenen Code in einer einzigen Kompilierungseinheit (möglicherweise eine Klasse) abzulegen, ihn in den verbleibenden Teilen des Codes zu verwenden und ihn mit dem aktuellen C ++ 11/14-Standard zu codieren. Dokumentieren Sie, warum und warum Sie es so schreiben, und portieren Sie es später während einer Wartungsphase auf C ++ 17, wenn es sinnvoll ist. (Kommentar zur ursprünglichen Frage)filesystem
Ihnen entstehen weit weniger Risiko darin als andere Dinge verwenden, wie Sie bereits wissen , dass es in C standardisiert wird ++ 17, und die genaue C ++ 17 - Spezifikation davon ist öffentlich zugänglich. Sie müssen also nur sicherstellen, dass Sie nur dieexperimental::filesystem
Funktionen verwenden, die in der C ++ 17-Spezifikation enthalten sind. Und natürlich müssen Sie wissen, dass alle Ihre Zielplattformen eineexperimental::filesystem
oder mehrere C ++ 17- Plattformen unterstützenstd::filesystem
.Antworten:
Nein, experimentelle Funktionen sind optional.
Ja, das C ++ - Komitee könnte sogar beschließen, ein Feature aufzugeben, oder im Zuge der Standardisierung könnte ein Fehler auftreten, der eine Änderung des Features erzwingen würde.
Im Allgemeinen ist es keine gute Idee, sich auf experimentelle Merkmale zu verlassen. Experimentelle Merkmale sind genau das, was das Wort sagt (dh um damit zu experimentieren).
quelle
Jemand aus dem Publikum stellte während des Vortrags "C ++ Standard Library Panel" auf der CppCon 2016 ( YouTube ) eine Frage zum Potenzial des Namens
experimental
, Benutzer davon abzuhalten , irgendetwas innerhalb des Namespace zu verwenden:Michael Wong (Vorsitzender von SG5 und SG14 und Herausgeber der Concurrency TS) stellte zunächst die Frage:
Alisdair Meredith (ehemaliger Vorsitzender der LWG) folgte dann:
Stephan T. Lavavej (Betreuer der STL-Implementierung von Microsoft) antwortete zuletzt:
Es scheint also, dass unter den Standardbibliotheksentwicklern und Komiteemitgliedern ein gewisser Wunsch besteht, dass zumindest in Zukunft der Inhalt des
std::experimental
Namespace wirklich "experimenteller" Natur sein sollte und es nicht als selbstverständlich angesehen werden sollte, dass etwas imstd::experimental
Willen ist mach es in den C ++ Standard.Und nein, soweit ich weiß, liegt es an den Standard-Bibliotheksanbietern, ob sie Implementierungen für die verschiedenen darin enthaltenen Funktionen bereitstellen
std::experimental
.quelle
"Experimentell" ist ein leicht übertriebener Begriff. Die
filesystem
Bibliothek hat ihren Ursprung in Boost und durchlief dort einige Iterationen, bevor sie bei ISO eingereicht wurde.ISO-Standards sind jedoch absichtlich sehr konservativ. Wenn man es experimentell nennt, verspricht ISO ausdrücklich nicht, dass die Benennung stabil ist. Es ist völlig klar, dass Sie Ihren Code in Zukunft irgendwann neu adressieren müssen. Wenn Sie jedoch ISO kennen, ist es wahrscheinlich, dass es Anleitungen gibt, wie.
Erwarten Sie, dass die Kompatibilität zwischen Compilern angemessen ist. Es wird jedoch Eckfälle geben (z. B. Windows-Laufwerksrelationen), und genau deshalb könnte ein zukünftiger Standard Ihren vorhandenen Code beschädigen. Im Idealfall würde es Ihren Code genau dann beschädigen, wenn Sie von diesem Eckfall abhängen, aber das ist keine Garantie.
quelle
Einige Punkte zu beachten:
Wie plattformübergreifend ist Ihr Projekt? Wenn nur ein Compiler beteiligt ist, können Sie dessen Implementierung und Erfolgsbilanz überprüfen, um zu entscheiden. Oder frag sie!
Wie groß ist Ihre Codebasis? Wie groß wären die Auswirkungen von Änderungen?
Wie grundlegend für Ihr Projekt sind die Funktionen, die von der API / Bibliothek / Funktion bereitgestellt werden?
Was sind die Alternativen?
experimental::
oder das Erzwingen von Problemumgehungen sein.experimental
System ausfällt oder verschwindet.quelle