Можно ли получить доступ к компонентам STD :: FileSystem :: PATH в виде представлений / без копирования?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Можно ли получить доступ к компонентам STD :: FileSystem :: PATH в виде представлений / без копирования?

Сообщение Anonymous »

При использовании std :: fileSystem :: {recurusive_} Directory_iterator , обычно хотят отфильтровать результаты на основе некоторой шаблона. Обычно я внедряю это что-то вроде: < /p>

Код: Выделить всё

template 
void for_dirents_in_path(const std::filesystem::path& path, T callback) {
std::error_code ec;
for (auto& dirent : DirectoryIterator(path, ec)) {
if (!dirent.is_regular_file()) {
continue;
}
callback(std::move(dirent));
}
}

template 
void for_dirents_with_filename(const std::filesystem::path& path,
const std::string& filename,
T callback) {
for_dirents_in_path(
path, [&](const std::filesystem::directory_entry&& dirent) {
// you may also filter on e.g. dirent.path().extension()
if (dirent.path().filename() != filename) {
return;
}
callback(std::move(dirent));
});
}
Насколько я могу судить, std :: fileystem :: path Документы возвращают все копии базовых компонентов, что делает этот код очень неэффективным при сканировании больших каталогов (возможно, повторно), особенно в сборке отладки, где STL может вставлять проверки времени выполнения. На самом деле я бы рассмотрел вышеизложенные в сборе отладки. Это быстро становится громоздким и разочаровывает, потому что ясно, что STL уже реализует аксессов с нулевой копией внутри.

Код: Выделить всё

_NODISCARD inline wstring_view _Parse_filename(const wstring_view _Str) {
// attempt to parse _Str as a path and return the filename if it exists; otherwise, an empty view
const auto _First    = _Str.data();
const auto _Last     = _First + _Str.size();
const auto _Filename = _Find_filename(_First, _Last);
return wstring_view(_Filename, static_cast(_Last - _Filename));
}

_NODISCARD path filename() const {
// parse the filename from *this and return a copy if present; otherwise, return the empty path
return _Parse_filename(_Text);
}
В идеале, std :: fileystem :: path предложит возможность получить представления в его компоненты, однако я не знаю поддерживаемого способа сделать это. Я что -то упускаю или это контроль над спецификацией?


Подробнее здесь: https://stackoverflow.com/questions/797 ... ithout-cop
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»