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

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



 

你可能感兴趣的:(C++,STL,函数适配器实现)