複数条件の boost::adaptors::filtered

C++スレに絞り込み検索がどうのこうのとレスが付いてたので試しにやってみた。

#include <vector>
#include <iostream>

#include <boost/foreach.hpp>
#include <boost/range/adaptor/filtered.hpp>

namespace filter{

namespace detail{
    
    template<
        typename T, typename U
    >
    struct or_impl{
    
        or_impl(const T& lhs, const U& rhs)
            : lhs_(lhs) , rhs_(rhs){}
    
        template<typename T>
        bool operator ()(T src) const{
            return lhs_(src) || rhs_(src);
        }
    private:
        const T&    lhs_;
        const U&    rhs_;
    };

    template<
        typename T, typename U
    >
    struct and_impl{
    
        and_impl(const T& lhs, const U& rhs)
            : lhs_(lhs) , rhs_(rhs){}
    
        template<typename T>
        bool operator ()(T src) const{
            return lhs_(src) && rhs_(src);
        }
    private:
        const T&    lhs_;
        const U&    rhs_;
    };

    
    struct even_impl{
        bool operator ()(int x) const{
            return x % 2 == 0;
        }
    };

}        // namespace detail

template<
    typename T, typename U
>
detail::or_impl<T, U>
operator ||(const T& lhs, const U& rhs){
    return detail::or_impl<T, U>(lhs, rhs);
}

template<
    typename T, typename U
>
detail::and_impl<T, U>
operator &&(const T& lhs, const U& rhs){
    return detail::and_impl<T, U>(lhs, rhs);
}

struct over{
    over(int index) : index_(index){}

    bool operator ()(int x) const{
        return index_ <= x;
    }
private:
    int index_;
};

struct under{
    under(int index) : index_(index){}

    bool operator ()(int x) const{
        return index_ >= x;
    }
private:
    int index_;
};

static const detail::even_impl even;

}        // namespace filter


int
main(){
    
    using boost::adaptors::filtered;
    using namespace filter;
    
    std::vector<int>    data;
    for(int i = 0 ; i < 20 ; i ++){
        data.push_back(i);
    }

    // 3〜15の偶数の数字を絞り込み
    auto result = data|filtered( over(3) && under(15) && even );
    BOOST_FOREACH(int index, result){
        std::cout << index << ", ";
    }
    
    return 0;
}
4, 6, 8, 10, 12, 14,

検索処理は、boost::adaptors::filtered を利用してフィルタリングしています。
単に条件検索をやりたかったので、検索方法は特に考えてないです。
条件が複数ある場合は、|| や && を使ってバインドして渡してます。
論理演算子オーバーロードを使用してる辺りがすごく怪しい。
パッと見のコードは見やすいんだけども ADL を利用してるから namespace に縛られるのが不便かな?

p_stade.oven とか使えばもうちょっとコードが短くなりそうな気がする。
分かる人だと既存のコードで攻略できそうな感じ。
色々調べてみたけど知識が乏しいので現状はこれで手一杯です。