당신은 QDirIterator
에 앞으로 순차적 반복자 어댑터를 구현할 수 있습니다
// https://github.com/KubaO/stackoverflown/tree/master/questions/dir-iterator-39133673
#include <QtCore>
#include <boost/optional.hpp>
#include <boost/iterator/iterator_facade.hpp>
class QDir_iterator : public
boost::iterator_facade<QDir_iterator, QString,
boost::forward_traversal_tag, QString>
{
friend class boost::iterator_core_access;
boost::optional<QDirIterator &> it;
bool equal(const QDir_iterator & other) const {
return **this == *other;
}
QString dereference() const {
return it != boost::none ? it->filePath() : QString{};
}
void increment() {
it->next();
}
public:
QDir_iterator() = default;
QDir_iterator(QDirIterator & dir) : it{dir} {
it->next();
}
};
QDir_iterator begin(QDirIterator & dir) { return QDir_iterator{dir}; }
QDir_iterator end(QDirIterator &) { return QDir_iterator{}; }
어댑터가에 사용할 수를 QDirIterator
이므로 QDirIterator
을 다음 범위에 직접 전달할 수 있습니다.
void test1() {
auto curr = QDir::current();
auto entries = curr.entryList();
int i = 0;
for (auto dir : QDirIterator{curr}) ++i;
Q_ASSERT(i == entries.count());
}
물론 플래그 또는 필터를 QDirIterator
으로 전달할 수 있습니다. 어댑터가이를 따릅니다. - 균일 한 초기화가 꽤 고통하게
template <typename F>
void iterate(QDirIterator && it, F && fun) {
while (it.hasNext())
fun(it.next());
}
반복 임시 반복자를 사용
당신이 부스트 알레르기 경우
, 당신은 보강 범위를 처리하는 데 "저장"할 디렉토리를 반복 밖으로 요인 수 :
void test2() {
auto curr = QDir::current();
auto entries = curr.entryList();
int i = 0, j = 0;
iterate({curr}, [&](const QString &){ ++i; });
Q_ASSERT(entries.length() == i);
iterate({curr}, [&](const QString &){ ++j; });
Q_ASSERT(entries.length() == j);
}
고마워요! 식별자를 다시 사용하는 것이 가장 좋습니다. – TranslucentCloud
상황에 따라 다릅니다. 일반적으로 변수의 범위는 필요한 것보다 커야합니다. 경우에 따라 반복되는 부분을 별도의 기능으로 옮기는 것이 더 나을 수도 있습니다. –