Mam projekt, który obecnie używa C ++ 11/14, ale wymaga czegoś takiego std::filesystem
, co jest dostępne tylko w C ++ 17, stąd nie mam szansy, aby go obecnie używać. Widzę jednak, że jest dostępny w moim obecnym kompilatorze jako std::experimental::filesystem
. Czy warto korzystać z funkcji eksperymentalnych, zakładając, że w przyszłości mógłbym dodać coś takiego:
#ifdef CXX17 //if this is C++17
std::filesystem::something ...;
#else
std::experimental::filesystem::something ...;
#endif
Moje obawy to:
1. Czy gwarantuje się, że wszystkie zgodne kompilatory mają te same funkcje eksperymentalne?
2. Czy funkcje eksperymentalne są podatne na duże zmiany, które czynią je zawodnymi?
Może jest więcej rzeczy do zastanowienia. Dlaczego powinienem lub nie powinienem ich używać? Zaintrygował mnie nowy projekt i nie wiem, na co zdecydować.
c++
c++11
portability
c++17
c++-standard-library
Fizyk kwantowy
źródło
źródło
#idef CXX17
. IMHO, przenośnym sposobem jest umieszczenie całego kodu związanego z systemem plików w jednej jednostce kompilacji (może to być klasa), użycie go w pozostałych częściach kodu, zakodowanie w aktualnym standardzie C ++ 11/14. Udokumentuj, dlaczego tak to piszesz, i ostatecznie przenieś go do C ++ 17 później w fazie konserwacji, jeśli ma to sens. (komentując pierwotne pytanie)filesystem
używasz go znacznie mniej ryzykujesz niż inne rzeczy, ponieważ już wiesz, że jest on standaryzowany w C ++ 17, a dokładna jego specyfikacja w C ++ 17 jest publicznie dostępna. Więc wszystko, co musisz zrobić, to upewnić się, że używasz tylkoexperimental::filesystem
funkcji, które są w specyfikacji C ++ 17. I oczywiście musisz wiedzieć, że wszystkie docelowe platformy obsługują jedną zexperimental::filesystem
lub C ++ 17std::filesystem
.Odpowiedzi:
Nie, funkcje eksperymentalne są opcjonalne.
Tak, komitet C ++ może nawet zdecydować o porzuceniu funkcji lub w procesie standaryzacji może pojawić się defekt, który wymusiłby zmianę funkcji.
Generalnie poleganie na funkcjach eksperymentalnych nie jest dobrym pomysłem. Cechy eksperymentalne są dokładnie tym, co mówi słowo (tj. Eksperymentować).
źródło
Ktoś z publiczności zadał pytanie podczas wykładu „C ++ Standard Library Panel” na CppCon 2016 ( YouTube ) na temat potencjału nazwy
experimental
odstraszającej użytkowników od używania czegokolwiek z przestrzeni nazw:Michael Wong (przewodniczący SG5 i SG14 oraz redaktor Concurrency TS) zadał pytanie jako pierwszy:
Alisdair Meredith (były przewodniczący LWG) kontynuował:
Stephan T. Lavavej (opiekun implementacji STL Microsoftu) odpowiedział jako ostatni:
Wydaje się więc, że wśród twórców bibliotek standardowych i członków komitetów istnieje pewne pragnienie, aby przynajmniej w przyszłości zawartość
std::experimental
przestrzeni nazw miała charakter prawdziwie „eksperymentalny” i nie należy przyjmować za pewnik, że cośstd::experimental
będzie uczynić go standardem C ++.I nie, o ile rozumiem, od dostawców bibliotek standardowych zależy, czy dostarczą implementacje dla różnych funkcji
std::experimental
.źródło
„Eksperymentalny” to termin nieco przesadzony.
filesystem
Biblioteka powstała w Boost, i przeszedł przez kilka iteracji tam, zanim zostaną przedłożone ISO.Jednak normy ISO są celowo bardzo konserwatywne. Nazwanie tego eksperymentem oznacza, że ISO wyraźnie nie obiecuje, że nazewnictwo będzie stabilne; jest oczywiste, że w przyszłości konieczne będzie ponowne zaadresowanie kodu. Ale znając ISO, prawdopodobnie będą wskazówki, jak to zrobić.
Jeśli chodzi o zgodność między kompilatorami, spodziewaj się, że będzie ona rozsądna. Ale będą przypadki narożne (pomyślmy na przykład o ścieżkach względem dysku systemu Windows) i właśnie dlatego przyszły standard może złamać twój istniejący kod. Idealnie byłoby złamać kod wtedy i tylko wtedy, gdybyś polegał na tym narożnym przypadku, ale to nie jest gwarancja.
źródło
Kilka kwestii do rozważenia:
Jak wieloplatformowy jest Twój projekt? Jeśli zaangażowany jest tylko jeden kompilator, możesz sprawdzić jego implementację i historię, aby podjąć decyzję. Albo ich zapytaj!
Jak duży jest Twój kod? Jak duży byłby wpływ zmian?
Jak fundamentalne dla twojego projektu są funkcje dostarczane przez API / bibliotekę / funkcję?
Jakie są alternatywy?
experimental::
, lub tak trudne, jak wymuszenie obejścia.experimental
jeden z nich zawiódł lub zniknął.źródło