Следующий фрагмент кода предназначен для удаления первой части пути, если он существует:
#include <filesystem>
std::filesystem::path strip_prefix(std::filesystem::path p)
{
if (auto it{p.begin()}; it != p.end())
{
++it;
return std::filesystem::path(it, p.end());
}
return p;
}
(См.: https://godbolt.org/z/wkXhcw)
Я был удивлен, узнав, что это не работает. Код не компилируется, так как конструктор пути принимает только итераторы, которые перебирают последовательности символов. Я могу видеть использование этого, но зачем ограничивать конструкцию только такими итераторами? На мой взгляд, нелогично не поддерживать построение пути из собственных итераторов. Насколько я знаю, большинство других типов STL поддерживают эту идиому.
Что может быть эффективной реализацией для достижения той же цели, кроме полной реконструкции нового пути?
Обновление: в этом контексте я нашел следующее обсуждение актуальным/забавным: http://boost.2283326.n4.nabble.com/boost-filesystem-path-frustration-td4641734.html. Я согласен с Дейвом здесь. Я думаю, что видеть путь как контейнер элементов пути - это очень естественный способ взглянуть на него (с точки зрения программиста).