gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:48:37 33 4
gpt4 key购买 nike

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

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com