/* * Binders * */ template <class T> class less_than : public unary_function<T,bool> { T arg2; public: explicit less_than(const T& x) : arg2(x) { } bool operator()(const T& x) const { return x<arg2; } }; /* * Now, we can write the following: */ void f(list<int>& c) { list<int>::const_iterator p = find_if(c.begin(),c.end(),less_than<int>(7)); // ... } /* * In a more general way is implemented in STL: * */ template <class BinOp> class binder2nd : public unary_function<BinOp::first_argument_type, BinOp::result_type> { protected: BinOp op; typename BinOp::second_argument_type arg2; public: binder2nd(const BinOp& x, const typename BinOp::second_argument_type& v) : op(x), arg2(v) { } result_type operator()(const argument_type& x) const { return op(x,arg2); } }; template <class BinOp, class T> binder2nd<BinOp> bind2nd(const BinOp& op, const T& v) { return binder2nd<BinOp>(op,v); } /* * Usage of a binder * */ void f(list<int>& c) { list<int>::const_iterator p = find_if(c.begin(),c.end(),bind2nd(less<int>(),7)); // ... } template <class T> struct less_than : public binder2nd< less<T> > { explicit less_than(const T& x) : binder2nd(less<T>(),x) { } }; void f(list<int>& c) { list<int>::const_iterator p = find_if(c.begin(),c.end(),less_than<int>(7)); // ... }