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

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



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值