STL アルゴリズム ( など) で使用するさまざまな述語 (この特定のケースでは初期状態の関数オブジェクト) があるとしcopy_if
ますsort
。問題は、構成の変更またはユーザー入力によって実行時に述語が変更される可能性があることです。私は polymorphism と virtual を使用することを考えましたが、このような解決策operator()
に落ち着きましたstd::function
(これは私を C++11 の領域に置きますが、それは問題ありません)
struct PlainFilter {
PlainFilter(string filter):m_filter(filter)
{}
bool operator() (const string& toMatch)
{one way}
};
struct AcronymFilter {
AcronymFilter (string filter):m_filter(filter)
{}
bool operator() (const string& toMatch)
{a different way}
};
enum FilterTypes {plain,acronym};
vector<string> FilterStuff(string filter, vector<string> in)
{
vector<string> out;
std::function<bool(const string&)> foo;
if( filterType == plain)
foo = PlainFilter(filter);
else if( filterType == acronym)
foo = AcronymFilter(filter);
copy_if(in.begin(),in.end(),back_inserter(out),foo);
return out;
}
これでいいですか?
プログラムの存続期間中にフィルターの種類が 1 回またはまったく変更されない可能性があるため、文字列をフィルター処理する必要があるたびに if else ステートメントを使用することは避けたいと思います。問題に対する他の異なる見方も大歓迎です..