У меня есть проект, который в настоящее время использует 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]) о возможных название "экспериментальный", чтобы напугать пользователей от использования какого-либо пространства имен:
вы, ребята, рассмотрим содержание
СТД::экспериментальный
пространства имен] производство готовых и заключается в том, что аргумент, который может быть сделан, [что] он'ы эффективно готовое производство в течение следующих 3 лет, и может быть, вы должны изменить свой код спустя 3 года, может быть?
Майкл Вонг (председатель ИК5 и SG14 и редактор параллелизма ТС) выпустил первый вопрос:
Я думаю, что там's сильное консенсуса в рамках комитета, что он практически готов к внедрению в производство. Как я уже говорил, в большинстве случаев 99% он получает воздух-за. Мы хотим, чтобы убедиться, что он's не является препятствием для вас, чтобы использовать его. Вы можете понять, почему мы хотим поставить большие возможности, большие группы функций, в таком контексте, так что это не'т нарушать покой всей библиотечной системы, но это также делает его легче для вас, чтобы использовать его. Сейчас вы можете включить ССЗ с определенным флагом концепции, вы знаете, что на самом деле делает его легче для вас, чтобы сегментировать его.
Алисдэр Мередит (бывший председатель РГПВ), затем последовали:
Я'м собирается принять противоположную позицию здесь. Одна из вещей, травы [Саттер] как сказал руководитель WG21, стандартная группа, когда мы отправились по пути ЦЭС, он не'т думаю, что ЦЭС удастся, пока мы не принесли что-то вперед, потому что это означает, что мы'повторно не будучи достаточно опытной, мы'повторно не достаточно амбициозных в том, что мы'ре, используя ЦЭС для. Мы действительно хотим, что "экспериментальные", чтобы быть намеком, что да, эти вещи могут меняться, мы'повторно не обязывает к этому, и мы можем сделать что-то неправильно. Это позволяло снизить барьер для вещей, которые мы считаем как амбициозный и достичь как можно [...] сейчас уровень вроде бы на три выпуска цикла, мы должны быть гораздо более основательным в самом деле экспериментальные функции в ТС, и, возможно, наступал все более стремительно в основной стандарт себя. Но опять же, это будет весело для нас темой для обсуждения на ближайшие несколько [C стандарт комитета++] заседаний.
Т. Lavavej Стефан (сопровождающий от Microsoft'реализация стл s) был последним, чтобы ответить:
Это's важный для того чтобы провести различие между experimentalness интерфейса и experimentalness реализации, потому что, когда вы говорите "не готов" и что это значит? Как правило, и"готов" и, можно подумать, что речь о реализации. Это'вполне возможно для осуществления [что-то в СТД::экспериментальный
] абсолютно [...] пуленепробиваемый. [...] Что-то вроде [...] В в
<случайных>` заголовок в ТР1, [это было] очень, очень приятно в ТР1, и вы могли бы иметь абсолютно пуленепробиваемые осуществления этого, но оказалось, что интерфейс существенно месили [до релиза] C++11 и [...] если бы мы знали тогда то, что мы делаем сейчас, поместив в "экспериментальные" было бы лучшим сигналом для людей, что, "Эй, может быть, вы Дон'т хотите использовать СТД::экспериментальный::variate_generator, потому что, ха-ха, Это'ы исчезнешь в C++11 и".
Так и кажется, что есть какое-то желание из стандартной библиотеки разработчики и члены комитета, которые, в будущем, по крайней мере, содержимое СТД::экспериментальный
пространства имен должен быть по-настоящему "подопытные" в природе, и это не должно быть само собой разумеющимся, что что-то в СТД::экспериментальный` войдет в стандарт C++.
И нет, насколько я понимаю, это до стандарта, поставщиков библиотеке, можно ли их реализовать различные функции в СТД::экспериментальном.
quot;подопытные"&; - это слегка преувеличено срок. Библиотека файловой системы `возникла в Boost и прошли через несколько итераций, прежде чем будет представлен в ISO.
Однако стандарты ИСО намеренно чрезвычайно консервативной. Называть это экспериментальным путем ИСО явно не'т обещаю, что имен будет стабильным; его'ы совершенно ясно, что вам нужно решить свой код через некоторое время в будущем. Но, зная ИСО, это'ы вероятно, что там будет руководство.
Что касается совместимости между компиляторами, ожидал, что это будет разумно. Но будут случаи углу (думаю диска Windows относительные пути например), и что'именно поэтому будущий стандарт может нарушить существующий код. В идеале, это разобьет вам код, если, и только если зависит от этого угла дело, но это's не гарантия.
может быть, там's больше вещей, чтобы удивляться.
Несколько пунктов, чтобы рассмотреть:
Как мультиплатформенный проект? Если существует только один компилятор, то вы можете проверить его реализации и послужной решать. Или спросите у них!
Насколько велик ваш код? Насколько велико будет влияние изменения?
Как основополагающее значение для вашего проекта являются возможности, предоставляемые API/библиотеки/функции?
Каковы альтернативы?
Использовать экспериментальную функцию, адаптировать код для модификации, когда/если она становится стандартизированной. Может быть так же легко, как удаление экспериментальные::
, или так сложно, как заставляя обходные пути.
Добавить слой абстракции (Серега Балеста комментарий). Если экспериментальная функция изменения вашего переписывает изолированы. Для стандартной функции, это может быть перебор (СТД::файловая система-это уже уровень абстракции...).
Использовать другой API/библиотека. Те же вопросы: зрелость? робастность? стабильность? портативность? простота использования? особенности?
В случае с std::файловая система (или сеть ТС), есть тип Boost::файловая система (респ. буст::асио) как альтернативный или запасной вариант, в случае "экспериментальные" не удается или desappears.