我需要查找目录中的所有常规文件,并希望使用 C++20 范围(不是 Eric Niebler 的 range-v3)库。我想出了以下代码:
namespace fs = std::filesystem;
std::vector<fs::directory_entry> entries{ fs::directory_iterator("D:\\Path"), fs::directory_iterator() };
std::vector<fs::path> paths;
std::ranges::copy(entries |
std::views::filter([](const fs::directory_entry& entry) { return entry.is_regular_file(); }) |
std::views::transform([](const fs::directory_entry& entry) { return entry.path(); }),
std::back_inserter(paths));
Run Code Online (Sandbox Code Playgroud)
这可行,但我对使用 lambda 的额外样板感到不舒服;我习惯了 Java 8 流库,我不明白为什么不能直接使用成员函数。这是我第一次尝试重构:
std::ranges::copy(entries |
std::views::filter(fs::directory_entry::is_regular_file) |
std::views::transform(fs::directory_entry::path),
std::back_inserter(paths));
Run Code Online (Sandbox Code Playgroud)
这导致了编译器错误:
error C3867: 'std::filesystem::directory_entry::is_regular_file': non-standard syntax; use '&' to create a pointer to member
error C3889: call to object of class type 'std::ranges::views::_Filter_fn': no matching call operator found
...
Run Code Online (Sandbox Code Playgroud)
所以我尝试了这个:
std::ranges::copy(entries | …Run Code Online (Sandbox Code Playgroud)