2016-08-24 4 views
0

Qt 5 프로젝트의 단일 범위에서 복수 QDirIterator을 사용합니다.Qt 5의 기존 QDirIterator 재사용

QDirIterator i(QDir::currentPath(), QDir::Dirs | QDir::NoDotAndDotDot); 
while (i.hasNext()) { 
    doSomething(); 
}; 

지금 나는 모든 그들의 자신의 이름 (i0, i1, i2 등) 여러 개체를 사용하고, 나는이에 프로젝트 i에 걸쳐 하나의 이름을 사용하는 방법을 궁금해 : 그들은 일반적으로 다음과 같이 예? 다시 사용하려면 기존 QDirIterator의 서비스를 어떻게 해제해야합니까?

답변

2

C++ 예를 들어, 당신이 필요로 어디서든 새로운 범위를 소개 할 수 있습니다 :

{ 
    QDirIterator i(path1, QDir::Dirs | QDir::NoDotAndDotDot); 
    while (i.hasNext()) { 
    doSomething(); 
    }; 
} 
{ 
    QDirIterator i(path2, QDir::Dirs | QDir::NoDotAndDotDot); 
    while (i.hasNext()) { 
    doSomething(); 
    }; 
} 
+0

고마워요! 식별자를 다시 사용하는 것이 가장 좋습니다. – TranslucentCloud

+2

상황에 따라 다릅니다. 일반적으로 변수의 범위는 필요한 것보다 커야합니다. 경우에 따라 반복되는 부분을 별도의 기능으로 옮기는 것이 더 나을 수도 있습니다. –

0

당신은 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); 
} 
관련 문제