winstl::findfile_sequence_w, который оборачивает вызовы системных функций FindFirstFileW, FindNextFileW в STL-контейнер. С его помощью перебор файлов реализуется так:
#include <winstl/filesystem/findfile_sequence.hpp> using namespace stlsoft; using namespace winstl; findfile_sequence_w seq(L"c:\", L"*.*", findfile_sequence_w::files); findfile_sequence_w::const_iterator p = seq.begin(); while (p != seq.end()) { std::wstring filename = (*p).get_filename(); ++p; }Чтобы сделать код более компактным, можно применить BOOST_FOREACH:
findfile_sequence_w seq(L"c:\", L"*.*", findfile_sequence_w::files); BOOST_FOREACH(findfile_sequence_w::value_type const& t, f) { std::wstring filename = t.get_filename(); }Но здесь ожидает неприятный сюрприз: BOOST_FOREACH требует наличие двух типов итераторов: iterator и const_iterator. В findfile_sequence_w является псевдо-STL-контейнером - типа "iterator" в нем нет.
Не беда. Функциональность BOOST_FOREACH предусматривает возможность расширения на случай использования нестандартных коллекций.
Так что можно заставить BOOST_FOREACH использовать "const_iterator" вместо "iterator":
#include <boost/foreach.hpp> namespace boost { /*possibility to use BOOST_FOREACH with findfile_sequence_w; findfile_sequence_w doesn't contain "iterator", it contains only "const_iterator"*/ template<> struct range_mutable_iteratorПоскольку в findfile_sequence_w все функции константные, вреда от такой подмены не будет, а BOOST_FOREACH заработает как надо.{ typedef winstl::findfile_sequence_w::const_iterator type; }; } ... BOOST_FOREACH(findfile_sequence_w::value_type const& t, f){} //or, with same result: BOOST_FOREACH(findfile_sequence_w::value_type & t, f){}
Комментариев нет:
Отправить комментарий