原版C++bind2nd
我的C++bind2nd
主要是为了理解C++的仿函数:
template<typename Operation>
class mybinder2nd : public unary_function<typename Operation::first_argument_type,typename Operation::result_type> {
protected:
Operation op;
typename Operation::second_argument_type value;
public:
mybinder2nd(const Operation & x,const typename Operation::second_argument_type& y) :op(x),value(y){}
typename Operation::result_type operator()(typename Operation::first_argument_type & x) const {
return op(x,value);
}
typename Operation::result_type operator()(const typename Operation::first_argument_type & x) const {
return op(x,value);
}
};
template<typename Operation,typename T>
inline mybinder2nd<Operation> mybind2nd(const Operation & op,const T & t) {
typedef typename Operation::second_argument_type arg2_type;
return mybinder2nd<Operation>(op,arg2_type(t));
}
用起来:
int main()
{
vector<int>vt = {1,2,5,6,710,12,15};
sort(vt.begin(),vt.end(),myless<int>());
for(auto i : vt) cout<<i<<' ';
cout<< count_if(vt.begin(),vt.end(),not1(mybind2nd(less<int>(),40)));
return 0;
}
结果跟原版的一样。
讲讲调用过程:
count_if函数传进参数是两个迭代器和一个仿函数,意思是从头到尾遍历元素,返回满足仿函数条件的值的个数,关于迭代器的就不讲了,讲讲如何调用mybind2nd
:传进(less<int>(),40)
,就会调用:mybinder2nd<Operation> mybind2nd(const Operation & op,const T & t)
,此函数是返回mybinder2nd<Operation>(op,t);
,此时进入到mybinder2nd
,类mybinder2nd
中有两个数据op和value,先初始化对象,然后则是调用相应的操作符重载函数返回结果,这里()操作符重载返回的结果就是less<int>(x,40);
,需要注意的是less<int>里面的first_argument_type,second_argument_type,result_type
等变量(继承于binary_function
),如果错了,则无法编译成功。