/*
* Function Objects
*
*/
template<class T> class Sum {
T res;
public:
Sum(T i = 0) : res(i) { } // initialize
void operator()(T x) { res += x; } // accumulate
T result() const { return res; } // return sum
};
/*
* Usage of a function objects
*
*/
void f(list<double>& ld)
{
Sum<double> s;
s = for_each(ld.begin(),ld.end(),s); // invoke s() for each element of ld
cout << "the sum is " << s.result() << '\n';
}
template <class Arg, class Res> struct unary_function {
typedef Arg argument_type;
typedef Res result_type;
};
template <class Arg, class Arg2, class Res> struct binary_function {
typedef Arg first_argument_type;
typedef Arg2 second_argument_type;
typedef Res result_type;
};
template <class T> struct logical_not : public unary_function<T,bool> {
bool operator()(const T& x) const { return !x; }
};
template <class T> struct less : public binary_function<T,T,bool> {
bool operator()(const T& x, const T& y) const { return x<y; }
};