2012-02-24 11 views
2

私はboost :: filter_iteratorのペア(begin、end)を返すメソッドを実装しようとしています。boost異なる述語を持つフィルタイテレータ

私はこのメソッドをフィルタリングの点でカスタマイズできるようにしたいと思いますが、フィルターのイテレーターの範囲をtypedefすると、使用したい述語をハードコードする必要があるため、これを並べ替える方法がわかりませんメソッドが入力で受け取るパラメータに応じて選択します。

私はこのような何かがしたい:私は同様に可能テンプレート溶液について思ったが、私は1つは、呼び出す前に、自分のニーズに合った述語の実装とインスタンスにアクセスするためのクライアントが必要になります

enum FilterType 
{ 
    FilterOnState = 0, 
    FilterOnValue, 
    FilterOnSize, 
    FilterOnWhatever... 
} 

typedef boost::filter_iterator<PredicateStruct, std::list<Object>::iterator> filter_iterator; 

std::pair<filter_iterator, filter_iterator> filterObjects(FilterType filterType); 

をフィルターを使用すると、彼はほとんどすべて自分自身で仕事をするでしょう:それが私がenumベースのソリューションを最も好きにしている理由です。

template<typename P> 
std::pair<boost::filter_iterator<P, std::list<Object>::iterator>, 
      boost::filter_iterator<P, std::list<Object>::iterator>> filterObjects(P& predicate); 

述語 "ベースクラス"は、列挙ベースの実装の可能な解決策になりますか?

ありがとうございます! Giacomo

答えて

2

単に列挙型の値の代わりに事前定義された述部を提供するのはなぜですか?

struct predef_predicate{ 
    predef_predicate(FilterType f) 
    : filt(f) {} 

    template<class T> 
    bool operator()(T const& v) const{ 
    // filter in whatever way... 
    } 

private: 
    FilterType filt; 
}; 

namespace { // guard against ODR violations 
predef_predicate const filter_state(FilterOnState); 
predef_predicate const filter_values(FilterOnValue); 
// ... 
} 

そして、代わりに車輪の再発明の、ちょうどBoost.Range's filtered adaptorを使用しています。

#include <vector> 
#include <iterator> 
#include <boost/range/adaptor/filtered.hpp> 
#include <boost/range/algorith/copy.hpp> 

int main(){ 
    std::vector<int> v; 
    // fill v 
    std::vector<int> filtered; 
    boost::copy(v | boost::adaptors::filtered(filter_values), 
     std::back_inserter(filtered)); 
} 

そしてC++ 11では、lambdasのおかげで述語を作成する動作がさらに簡単になりました。

関連する問題