閑古鳥

オールドプログラマの日記。プログラミングとか病気(透析)の話とか。

boost::filter_iteratorは便利だけど書くのがめんどい

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 には含まれていないようですが。

2005-09-20 - p_stade;

汎用的で良いですね。