揭开函数适配器的面纱,编写自己的函数适配器-------小试牛刀

来源:互联网 发布:三知四会四个能力 编辑:程序博客网 时间:2024/04/29 14:42
/*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")));}

 
原创粉丝点击