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); }