c++ - 使用 fs::recursive_directory_iterator() 和 fs::directory_iterator() 的通用方法

标签 c++ c++17

我需要递归或不递归地遍历文件夹(给定 bool 参数)。我发现有 fs::recursive_directory_iterator()fs::directory_iterator()。在 Java 中,我希望它们实现相同的接口(interface)或共享共同的祖先,以便我可以替换所需的。但出于某种原因,这两个迭代器不共享共同的祖先,迫使编写如下代码:

  if (recursive_) {
    path = recursive_iterator_->path();
    recursive_iterator_++;
  } else {
    path = plain_iterator_->path();
    plain_iterator_++;
  }

我不敢相信这就是它应该的工作方式。我最初还假设有一些选项可以关闭 recursive_directory_iterator 的递归,但在 std::filesystem::directory_options 之间似乎没有任何选项。

该值在编译时未知。我认为应该可以使用诸如闭包之类的东西,甚至可以使用带有虚方法的子类,但看起来有点矫枉过正。

我应该根据需要在两个迭代器之间简单地使用条件切换,还是有更好的方法?

最佳答案

implement the same interface

他们有。他们都是InputIterators ,对 const std::filesystem::directory_entry& 的取消引用。

C++ 默认避免virtual

您可以使用 boost::any_range键入删除递归。

template <typename... Args>
auto make_directory_range(bool recursive, Args... args) {
    return recursive
        ? boost::make_iterator_range(fs::recursive_directory_iterator(args...), fs::recursive_directory_iterator()) | boost::adaptors::type_erased()
        : boost::make_iterator_range(fs::directory_iterator(args...), fs::directory_iterator());
}

using iterator_t = decltype(make_directory_range(true).begin());

auto range = make_directory_range(recursive_, args...);
iterator_t iterator = range.begin();
iterator_t end = range.end();

关于c++ - 使用 fs::recursive_directory_iterator() 和 fs::directory_iterator() 的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60511834/

相关文章:

c++ - 比较 googlemock 中指针的容器

c++ - 结构数组,其中包含数组。不会编译

parallel-processing - C++parallel_reduce如何使用初始值参数?

c++ - RVO为什么不应用于基类子对象初始化?

c++ - 如何在概念中使用 C++ requires 子句来要求成员变量满足概念约束?

c++ - 我们需要 std::as_const() 做什么?

c++ - 宏内的字符串连接

c++ - 在设计和构建嵌入式系统时考虑 Chaos Monkey

c++ - QProgressBar文本格式为时间

c++ - 如何使用索引运算符为容器定义类型特征?