/*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")));}