|
VMS Help CXXLSTD, Function Objects, Function Objects *Conan The Librarian |
Standard C++ Library
Copyright 1996, Rogue Wave Software, Inc.
NAME
Function_Objects - Objects with an operator() defined. Function
objects are used in place of pointers to functions as arguments to
templated algorithms.
SYNOPSIS
#include<functional>
// typedefs
template <class Arg, class Result>
struct unary_function;
template <class Arg1, class Arg2, class Result>
struct binary_function;
DESCRIPTION Function objects are objects with an operator() defined.
They are important for the effective use of the standard library's
generic algorithms, because the interface for each algorithmic
template can accept either an object with an operator() defined,
or a pointer to a function. The Standard C++ Library provides
both a standard set of function objects, and a pair of classes
that you can use as the base for creating your own function
objects.
Function objects that take one argument are called unary function
objects. Unary function objects are required to provide the
typedefs argument_type and result_type. Similarly, function
objects that take two arguments are called binary
function objects and, as such, are required to provide the typedefs
first_argument_type, second_argument_type, and result_type.
The classes unary_function and binary_function make the task of c
reating templated function objects easier. The necessary typedefs
for a unary or binary function object are provided by inheriting
from the appropriate function object class.
The function objects provided by the standard library are listed
below, together with a brief description of their operation. This
class reference also includes an alphabetic entry for each
function.
Name Operation
arithmetic functions
plus addition x + y
minus subtraction x - y
multiplies multiplication x * y
divides division x / y
modulus remainder x % y
negate negation - x
comparison functions
equal_to equality test x == y
not_equal_to inequality test x != y
greater greater comparison x > y
less less-than comparison x < y
greater_equal greater than or equal comparison x >= y
less_equal less than or equal comparison x <= y
logical functions
logical_and logical conjunction x && y
logical_or logical disjunction x || y
logical_not logical negation ! x
INTERFACE
template <class Arg, class Result>
struct unary_function{
typedef Arg argument_type;
typedef Result result_type;
};
template <class Arg1, class Arg2, class Result>
struct binary_function{
typedef Arg1 first_argument_type;
typedef Arg2 second_argument_type;
typedef Result result_type;
};
// Arithmetic Operations
template<class T>
struct plus : binary_function<T, T, T> {
T operator() (const T&, const T&) const;
};
template <class T>
struct minus : binary_function<T, T, T> {
T operator() (const T&, const T&) const;
};
template <class T>
struct multiplies : binary_function<T, T, T> {
T operator() (const T&, const T&) const;
};
template <class T>
struct divides : binary_function<T, T, T> {
T operator() (const T&, const T&) const;
};
template <class T>
struct modulus : binary_function<T, T, T> {
T operator() (const T&, const T&) const;
};
template <class T>
struct negate : unary_function<T, T> {
T operator() (const T&) const;
};
// Comparisons
template <class T>
struct equal_to : binary_function<T, T, bool> {
bool operator() (const T&, const T&) const;
};
template <class T>
struct not_equal_to : binary_function<T, T, bool> {
bool operator() (const T&, const T&) const;
};
template <class T>
struct greater : binary_function<T, T, bool> {
bool operator() (const T&, const T&) const;
};
template <class T>
struct less : binary_function<T, T, bool> {
bool operator() (const T&, const T&) const;
};
template <class T>
struct greater_equal : binary_function<T, T, bool> {
bool operator() (const T&, const T&) const;
};
template <class T>
struct less_equal : binary_function<T, T, bool> {
bool operator() (const T&, const T&) const;
};
// Logical Comparisons
template <class T>
struct logical_and : binary_function<T, T, bool> {
bool operator() (const T&, const T&) const;
};
template <class T>
struct logical_or : binary_function<T, T, bool> {
bool operator() (const T&, const T&) const;
};
template <class T>
struct logical_not : unary_function<T, T, bool> {
bool operator() (const T&, const T&) const;
};
EXAMPLE
//
// funct_ob.cpp
//
#include<functional>
#include<deque>
#include<vector>
#include<algorithm>
#include <iostream.h>
//Create a new function object from unary_function
template<class Arg>
class factorial : public unary_function<Arg, Arg>
{
public:
Arg operator()(const Arg& arg)
{
Arg a = 1;
for(Arg i = 2; i <= arg; i++)
a *= i;
return a;
}
};
int main()
{
//Initialize a deque with an array of ints
int init[7] = {1,2,3,4,5,6,7};
deque<int> d(init, init+7);
//Create an empty vector to store the factorials
vector<int> v((size_t)7);
//Transform the numbers in the deque to their factorials and
// store in the vector
transform(d.begin(), d.end(), v.begin(), factorial<int>());
//Print the results
cout << "The following numbers: " << endl << " ";
copy(d.begin(),d.end(),ostream_iterator<int,char>(cout," "));
cout << endl << endl;
cout << "Have the factorials: " << endl << " ";
copy(v.begin(),v.end(),ostream_iterator<int,char>(cout," "));
return 0;
}
Output :
The following numbers:
1 2 3 4 5 6 7
Have the factorials:
1 2 6 24 120 720 5040
WARNINGS
If your compiler does not support default template parameters, then
you need to always supply the Allocator template argument. For
instance, you'll have to write :
vector<int, allocator<int> > and deque<int, allocator<int> > instead
of :
vector<int> and deque<int>
SEE ALSO
binary_function, unary_function
STANDARDS CONFORMANCE
ANSI X3J16/ISO WG21 Joint C++ Committee
|
|