/*Just want to implement a function adapter*/
#include<iostream>
#include<string>
using std::string;
using std::cout;
using std::endl;
template<class T>
class GT{
public:
typedef bool return_type ; //STL思想
typedef T arg_fir_type;
typedef T arg_sec_type;
public:
bool operator()(T& opa,T& opb)
{
return opa == opb;
}
};
template<class T> //类实现函数适配器
class BindFirstArg{
public:
BindFirstArg(T t,typename T::arg_fir_type f):pre(t),fir(f){}
typename T::return_type operator()(typename T::arg_sec_type sec)
{
return pre(fir,sec);
}
private:
T pre; //predicate
typename T::arg_fir_type fir;
};
//用工厂思想去除BindFirstArg<GT<string> >(GT<string>(),string("to")))调用时<GT<string> >冗余性。
template<class T,class Tp>
inline BindFirstArg<T> bindFirstArg(T t,Tp f)
{
typedef typename T::arg_fir_type Arg_type;
return BindFirstArg<T>(t,static_cast<Arg_type>(f));
}
template<class InputInterator,class Pre>
size_t count_if(InputInterator beg,InputInterator end,Pre func)
{
size_t count = 0;
while(beg != end)
{
if(func(*beg++) != 0)count++;
}
return count;
}
int main() //三种调用方法
{
string s[10] = {"I","want","to","implement","a","function","adapter","to","to","to"};
GT<string> g;BindFirstArg< GT<string> > b(g,string("I"));
cout<<count_if(s,s+10,b)<<endl;
cout<<count_if(s,s+10,BindFirstArg<GT<string> >(GT<string>(),string("to")))<<endl;
cout<<count_if(s,s+10,bindFirstArg(g,string("to")));
}
|