假设您有不同的谓词(在这种特殊情况下具有初始状态的函数对象)与 STL 算法(copy_if
等sort
...)一起使用。事情是谓词可以通过配置更改或用户输入在运行时更改。我考虑过使用多态性和 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;
}
这个好吗?
我宁愿避免每次我需要过滤字符串时使用 if else 语句,因为过滤器类型可能会在程序的整个生命周期中更改一次或根本不更改。也欢迎对这个问题提出任何其他不同的看法。