我需要递归或不递归地遍历文件夹(给定 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/