boost::make_filter_iteratorとか毎回書くのが面倒なので、省略したい。ということで適当に関数を作ってみる。
template<class Pred, class T, class F> void filterd_foreach(T begin, T end, F f) { std::for_each( boost::make_filter_iterator<Pred>(begin, end), boost::make_filter_iterator<Pred>(end, end), f); } struct is_odd { template<class T> bool operator()(T const& v) { return (v % 2) == 1; } }; struct print { void operator()(int n) { cout << n << endl; } }; int main() { using namespace boost::assign; std::vector<int> v; v += 1, 2, 3, 4, 5, 6, 7, 8, 9, 10; filterd_foreach<is_odd>(v.begin(), v.end(), print()); }
書いた後 Boost.RangeEx に make_filter_range なる関数があることを知る。Boost 1.36.0 には含まれていないようですが。
汎用的で良いですね。