Sind die experimentellen features, die von modernen C++ zuverlässig für langfristige Projekte?

Ich habe ein Projekt, das derzeit verwendet C++11/14, aber es erfordert etwas wie std::filesystem, die es nur in C++17, und damit ich nicht die chance haben, derzeit verwenden. Ich sehe allerdings, dass es in meiner aktuellen compiler wie std::experimental::filesystem. Ist es eine gute Idee, um die Verwendung von experimentellen Funktionen, vorausgesetzt, ich könnte in der Zukunft hinzufügen, so etwas wie:

#ifdef CXX17 //if this is C++17
std::filesystem::something ...;
#else
std::experimental::filesystem::something ...;
#endif

Meine Bedenken sind:

1. Ist es garantiert, dass alle konformen Compiler haben den gleichen experimentellen features?

2. Sind experimentelle features anfällig, um große Veränderungen zu machen, dass Sie unzuverlässig?

Vielleicht gibt es mehr Dinge zu Fragen. Warum sollte ich oder sollte ich nicht verwenden? Ich bin verwirrt mit einem neuen Projekt und wissen nicht, was Sie entscheiden.

  • nicht das Wort experimental Ihre Fragen beantworten?
  • Nicht wirklich. Es ist ein wenig mehrdeutig. Alle, die ich finden konnte ist, dass es "möglicherweise" Hinzugefügt werden in der Zukunft standard oder entfernt werden kann. Aber ich weiß, es ist Hinzugefügt. Die Frage ist also über den Unterschied.
  • Vor allem eine Frage des Geschmacks, aber ich möchte vermeiden, überladen Sie den code mit #idef CXX17. IMHO, ist die tragbare Weg ist, um alle filesystem-code in einer einzigen Zusammenstellung Gerät (kann eine Klasse sein), verwenden Sie es, während die übrigen Teile des Codes, code ist es mit dem aktuellen C++11/14 Standards. Dokumentieren, wie ein Grund, warum Sie schreiben es so, und schließlich ist die Portierung auf C++17 später während einer Erhaltungsphase, wenn es Sinn macht. (Kommentar auf die ursprüngliche Frage)
  • Es war nur "experimentell", als ein Kandidat zur Eingabe des standard. Es ist nicht ein Spiegelbild der Qualität des code.
  • Das ist genau der Grund, warum ich denke, es ist mehrdeutig (also 101010 Erklärung in den Kommentaren).
  • Ehrlich gesagt ist das, wie mache ich es jetzt 🙂 , aber ich bin versucht, um zu sehen, ob ich einfachere Optionen.
  • Es gab durchaus ein paar änderungen zwischen den "experimentellen" und der Letzte C++ - 17-version finden Sie unter Dokument P0492R1
  • Im Fall von filesystem verursachen Sie weit weniger Gefahr, es zu benutzen als andere Dinge, wie Sie bereits wissen, dass es wird standardisiert in C++17, und die genaue C++17 Spezifikation ist öffentlich verfügbar. So alle Sie tun müssen ist, stellen Sie sicher, dass Sie nur die experimental::filesystem Funktionen, die in C++17 Spezifikation. Und natürlich muss man wissen, dass alle Ihre gezielte Plattformen unterstützen experimental::filesystem oder C++17 std::filesystem.
  • müssen Sie Globale suchen-und-ersetzen - std::experimental::filesystem --> std::filesystem wenn es nicht standardisiert !
  • Eine Sache zu prüfen ist, dass, während die Antworten hier sind gut, die wichtigste Frage bei diesen Entscheidungen ist "was ist Ihre Entwicklungsumgebung wie?" Wenn Ihre Umgebung hat eine Gewohnheit des habens von anämischen wartungsbudgets, dass kaum halten, Essen auf den Tisch und bits auf der Festplatte, werden Sie wahrscheinlich nicht wollen, zu satteln Ihre Zukunft Entwickler mit experimentellen Sachen. Auf der anderen Seite, wenn Sie auf eine langfristige agilen Projekt, das ständig darum, neue Energie in das system, die Vorteile können die Kosten überwiegen.
  • Als weiteres Beispiel, wenn Sie mission-kritische Sachen wie der nuklearen Triebwerk-management, oder auch nur die ABS-Bremse-management-Systeme, werden Sie wahrscheinlich haben, einen Körper, welcher verantwortlich für die Segnung, die ein Bibliotheks-feature, das Sie verwenden. Dass EZB-Körper haben etwas zu sagen über einen flüchtigen namespace!
  • Moderator-Hinweis: ich habe entfernt die langwierige und oft sehr Konstruktive Diskussion über die Vorzüge von diesem post. Bitte nehmen Sie solche Diskussionen zu Meta-Stack Overflow oder Stack-Overflow-Chat das nächste mal. Dies ist nicht der Ort den Menschen zu sagen, wie Sie Ihre Stimmen oder zu sehen, der die Beweggründe für die anderen.
  • +1 @HowardHinnant ' s Kommentar oben. Wieder Lesen dass. Eine weitere alternative ist die Suche nach der Quelle des experimental Bibliothek -- im Fall von filesystem, optional usw., das ist Boost. Wenn Sie sind berechtigt, die Nutzung zu Steigern, konnte man eine halbwegs stabile, tragbare interface gibt es, die sollte in etwa so einfach, den port zu C++17 als std::experimental.
  • Ich bin damit einverstanden. Eigentlich bin ich mit boost derzeit mit einer abstrakten Schnittstelle, die ich gemacht habe, aber hatte gehofft, ich könnte verlassen sich auf die standard nur.
  • Bitte beachten Sie, dass (1) es gibt bugs im Boost.Dateisystem noch fixiert werden (z.B., diese eine, die ich gemeldet und wurde vor kurzem behoben) und (2) die C++17 Bande gedacht haben, dass noch härter um die Ecke-Fälle wie nicht-POSIX-Dateisystemen wie Windows, welches ist der wahrscheinlichste Ort für die änderungen (siehe MSalters Antwort unten).
  • Auf der positiven Seite, der Autor von Boost.Dateisystem ist auch die gleiche person, die hat führte std::filesystem obwohl der Normung. 🙂

Schreibe einen Kommentar