Представлены экспериментальные функции современного C++ надежной для долгосрочных проектов?
У меня есть проект, который в настоящее время использует C++11/14, но он требует что-то типа СТД::файловая система, которая доступна только в C++17, и, следовательно, я не'т иметь возможность на данный момент использовать его. Однако я вижу, что это's доступный на мой текущий компилятор как СТД::экспериментальный::файловая система
. Это хорошая идея, чтобы использовать экспериментальные функции, предполагая, что я мог бы в будущем добавить что-то вроде:
#ifdef CXX17 //if this is C++17
std::filesystem::something ...;
#else
std::experimental::filesystem::something ...;
#endif
Мои опасения:
1. Это гарантирует, что все совместимые компиляторы имеют одинаковые экспериментальные функции?
2. Экспериментальные особенности подвержены большим изменениям, что делает их ненадежными?
Может быть, там's больше вещей, чтобы удивляться. Почему я должен или не должен их использовать? Я'м озадачиться новый проект и Дон'т знаю, что делать.
Нет, экспериментальные функции являются необязательными.
Да, комитет по C++ может даже решите отказаться от объекта или в процессе стандартизации дефект может придумать, что бы заставить объект изменить.
Как правило, это's не хорошая идея, чтобы зависеть от экспериментальных функций. Экспериментальные функции в точности то, что говорит слово (например, для эксперимента).
Кто-то из зала задал вопрос в "в стандартной библиотеки C++ - панель" и говорить на CppCon 2016 ([Ютуб][1]) о возможных название "экспериментальный", чтобы напугать пользователей от использования какого-либо пространства имен:
Майкл Вонг (председатель ИК5 и SG14 и редактор параллелизма ТС) выпустил первый вопрос:
Алисдэр Мередит (бывший председатель РГПВ), затем последовали:
Т. Lavavej Стефан (сопровождающий от Microsoft'реализация стл s) был последним, чтобы ответить:
Так и кажется, что есть какое-то желание из стандартной библиотеки разработчики и члены комитета, которые, в будущем, по крайней мере, содержимое
СТД::экспериментальный
пространства имен должен быть по-настоящему "подопытные" в природе, и это не должно быть само собой разумеющимся, что что-то в СТД::экспериментальный` войдет в стандарт C++.И нет, насколько я понимаю, это до стандарта, поставщиков библиотеке, можно ли их реализовать различные функции в СТД::экспериментальном.
quot;подопытные"&; - это слегка преувеличено срок. Библиотека файловой системы `возникла в Boost и прошли через несколько итераций, прежде чем будет представлен в ISO.
Однако стандарты ИСО намеренно чрезвычайно консервативной. Называть это экспериментальным путем ИСО явно не'т обещаю, что имен будет стабильным; его'ы совершенно ясно, что вам нужно решить свой код через некоторое время в будущем. Но, зная ИСО, это'ы вероятно, что там будет руководство.
Что касается совместимости между компиляторами, ожидал, что это будет разумно. Но будут случаи углу (думаю диска Windows относительные пути например), и что'именно поэтому будущий стандарт может нарушить существующий код. В идеале, это разобьет вам код, если, и только если зависит от этого угла дело, но это's не гарантия.
Несколько пунктов, чтобы рассмотреть:
Как мультиплатформенный проект? Если существует только один компилятор, то вы можете проверить его реализации и послужной решать. Или спросите у них!
Насколько велик ваш код? Насколько велико будет влияние изменения?
Как основополагающее значение для вашего проекта являются возможности, предоставляемые API/библиотеки/функции?
Каковы альтернативы?
Использовать экспериментальную функцию, адаптировать код для модификации, когда/если она становится стандартизированной. Может быть так же легко, как удаление
экспериментальные::
, или так сложно, как заставляя обходные пути.Добавить слой абстракции (Серега Балеста комментарий). Если экспериментальная функция изменения вашего переписывает изолированы. Для стандартной функции, это может быть перебор (СТД::файловая система-это уже уровень абстракции...).
Использовать другой API/библиотека. Те же вопросы: зрелость? робастность? стабильность? портативность? простота использования? особенности?
В случае с std::файловая система (или сеть ТС), есть тип Boost::файловая система (респ. буст::асио) как альтернативный или запасной вариант, в случае "экспериментальные" не удается или desappears.