Функция 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 ++)?
Хорошо, вот обстоятельства, которые могут возникнуть, когда у вас есть относительный путь и вы хотите вызвать такую функцию:
current_path
,absolute
, Обратите внимание, что благодаря файловым системам, таким как Windows, это не то же самое как сказать, что это относительно current_path
,absolute_path
который не является текущим путем.В случае № 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)
? Действительно, последнее делает намного более понятным то, что вы делаете, так как оно ставит абсолютный путь слева, куда он идет.
Других решений пока нет …