У меня есть проект, который в настоящее время использует C ++ 11/14, но для этого требуется что-то вроде того std::filesystem
, что доступно только в C ++ 17, и, следовательно, у меня нет возможности его использовать. Однако я вижу, что в моем текущем компиляторе он доступен как std::experimental::filesystem
. Хорошая идея - использовать экспериментальные функции, если в будущем я смогу добавить что-то вроде:
#ifdef CXX17 //if this is C++17
std::filesystem::something ...;
#else
std::experimental::filesystem::something ...;
#endif
Меня беспокоит:
1. Гарантируется ли, что все совместимые компиляторы имеют одинаковые экспериментальные функции?
2. Склонны ли экспериментальные функции к большим изменениям, которые делают их ненадежными?
Может быть, есть еще о чем задуматься. Почему я должен или не должен их использовать? Я озадачен новым проектом и не знаю, что решить.
c++
c++11
portability
c++17
c++-standard-library
Квантовый физик
источник
источник
#idef CXX17
. IMHO, переносимый способ - поместить весь код, связанный с файловой системой, в одну единицу компиляции (может быть класс), использовать его во всех остальных частях кода, закодировать его в соответствии с текущим стандартом C ++ 11/14. Задокументируйте, как и почему вы это пишете, и, в конечном итоге, перенесите его на C ++ 17 позже, на этапе обслуживания, если это имеет смысл. (комментируя исходный вопрос)filesystem
вы подвергаетесь гораздо меньшему риску при его использовании, чем другие вещи, поскольку вы уже знаете, что он стандартизирован в C ++ 17, и его точная спецификация C ++ 17 общедоступна. Поэтому все, что вам нужно сделать, это убедиться, что вы используете только теexperimental::filesystem
функции, которые указаны в спецификации C ++ 17. И, конечно же, вы должны знать, что все ваши целевые платформы поддерживают один изexperimental::filesystem
C ++ 17 или C ++ 17std::filesystem
.Ответы:
Нет, экспериментальные функции необязательны.
Да, комитет по C ++ может даже решить отказаться от функции, или в процессе стандартизации может возникнуть дефект, который заставит функцию измениться.
Как правило, полагаться на экспериментальные функции - не лучший вариант. Экспериментальные функции - это именно то, что сказано в слове (т. Е. Возможность экспериментировать).
источник
Кто-то из аудитории задал вопрос во время выступления «Панель стандартной библиотеки C ++» на CppCon 2016 ( YouTube ) о том, что имя
experimental
может отпугнуть пользователей от использования чего-либо в пространстве имен:Майкл Вонг (председатель ИК5 и ИК14 и редактор отдела параллелизма) первым ответил на вопрос:
Затем Алисдер Мередит (бывший председатель LWG) продолжил:
Последним ответил Стефан Т. Лававей (разработчик реализации Microsoft STL):
Таким образом, похоже, что среди разработчиков стандартных библиотек и членов комитета есть некоторое желание, чтобы, по крайней мере в будущем, содержимое
std::experimental
пространства имен было действительно «экспериментальным» по своей природе, и не следует воспринимать как само собой разумеющееся, что что-тоstd::experimental
будет сделать его стандартом C ++.И нет, насколько я понимаю, поставщики стандартных библиотек должны решать, предоставляют ли они реализации для различных функций внутри
std::experimental
.источник
«Экспериментальный» - это слегка преувеличенный термин.
filesystem
Библиотека возникла в Boost , и прошел через несколько итераций там, до представления ISO.Однако стандарты ISO намеренно очень консервативны. Назвать это экспериментальным означает, что ISO явно не обещает, что именование будет стабильным; Совершенно очевидно, что когда-нибудь в будущем вам нужно будет пересмотреть свой код. Но зная ISO, вероятно, будет руководство, как это сделать.
Что касается совместимости между компиляторами, ожидайте, что это будет разумно. Но будут и крайние случаи (например, относительные пути в Windows), и именно поэтому будущий стандарт может нарушить ваш существующий код. В идеале это сломало бы ваш код тогда и только тогда, когда вы зависите от этого углового случая, но это не гарантия.
источник
Несколько моментов, которые следует учитывать:
Насколько мультиплатформенен ваш проект? Если задействован только один компилятор, вы можете проверить его реализацию и отслеживать результаты, чтобы принять решение. Или спросите их!
Насколько велика ваша кодовая база? Насколько велико будет влияние изменений?
Насколько важны для вашего проекта функции, предоставляемые API / библиотекой / функцией?
Какие есть альтернативы?
experimental::
, или так же сложно, как принудительные обходные пути.experimental
отказа или исчезновения.источник