Figure 2: Function and1

template<class Ufn1, class Ufn2>
class unary_and  
   : public std::unary_function<Ufn1::argument_type, bool> {
public:
   explicit unary_and(Ufn1 Fn1, Ufn2 Fn2)
      : m_Fn1(Fn1), m_Fn2(Fn2) {}
   bool operator()(Ufn1::argument_type arg) const
   { return m_Fn1(arg) && m_Fn2(arg); }
private:
   Ufn1 m_Fn1;
   Ufn2 m_Fn2;
};

template<class Ufn1, class Ufn2>
unary_and<Ufn1, Ufn2> and1(Ufn1 Fn1, Ufn2 Fn2)
{ return unary_and<Ufn1, Ufn2>(Fn1, Fn2); }