Как заменить базовый параметр, удаленный из boost :: filesystem :: weakly_relative и std :: filesystem :: canonical

Функция boost::filesystem::canonical() (документ 1,66, документ текущей версии) предлагает два аргумента (игнорируя перегрузку кода ошибки) base, Первый — это путь для канонизации, второй аргумент — это базовый путь, используемый для того, чтобы сделать первый путь абсолютным, если он относительный. По умолчанию current_path () используется для этого аргумента.

Boost 1.60 представляет некоторые новые функции, среди которых boost::filesystem::weakly_canonical() (документ 1,66, документ текущей версии). В этой функции отсутствует второй аргумент. То же самое верно для стандартизированных (C ++ 17) вариантов std::filesystem::canonical() а также std::filesystem::weakly_canonical() (увидеть cppreference).

Я хочу обменять canonical() с weakly_canonical(), но я использовал второй аргумент. Вот как я понял, что этот аргумент был удален. Теперь мне интересно, почему он был удален и как я могу сделать путь сам по себе.

Я нашел отчет о дефектах который намекнул это разрешение для C ++ 17, но, честно говоря, я действительно не понимаю обоснование. Я был бы рад получить объяснение или, может быть, лучше пример, где перегрузка с базой была бы чрезмерной.

И, конечно, мне интересно, как мне тогда преобразовать относительный путь в абсолютный путь, используя базовый каталог, который не является текущим каталогом. Должен ли я просто использовать base / p как намекнул на отношение к std::filesystem::absolute() потому что я знаю, что это правильная форма в моей целевой системе (Windows с Visual C ++)?

1

Решение

Хорошо, вот обстоятельства, которые могут возникнуть, когда у вас есть относительный путь и вы хотите вызвать такую ​​функцию:

  1. Вы знаете, что путь относительно current_path,
  2. Вы знаете, что путь можно сделать абсолютным, позвонив absolute, Обратите внимание, что благодаря файловым системам, таким как Windows, это не то же самое как сказать, что это относительно current_path,
  3. Вы знаете, что путь относительно некоторых известных absolute_path который не является текущим путем.
  4. Вы не знаете, является ли путь относительным или нет.

В случае № 4, вашим первым шагом должно быть выяснение, является ли оно относительным, и если да, то относительно чего оно. Как только это будет сделано, вы вернетесь к случаям 1-3.

В каждом из случаев 1-3 у вас есть прямой способ вычислить абсолютный путь. В случае 1 вы используете current_path() / rel, В случае 2 вы используете absolute(rel), В случае 3 вы используете absolute_path / rel, (примечание: это не только «правильная форма в моей целевой системе (Windows с Visual C ++)», это правильная форма период.)

В оригинальной версии canonical/weakly_canonicalфункции обрабатывали только случаи 1 и 3. Случай 2 был невозможен в рамках функции. Делая функции более низкими, заставляя их использовать absolute для относительных путей, а не принимать базовый путь, который по умолчанию current_path(), это позволяет функциям обрабатывать случай 2, а также другие случаи.

Они могли бы изменить это так, чтобы были перегрузки, которые не принимают путь (а не по умолчанию current_path()) который бы использовал absolute, Но на самом деле, какая разница между canonical(rel, absolute_path) а также canonical(absolute_path / rel)? Действительно, последнее делает намного более понятным то, что вы делаете, так как оно ставит абсолютный путь слева, куда он идет.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]