The C++ standard defines Predicate
as follows (25/7):
The Predicate parameter is used
whenever an algorithm expects a
function object that when applied to
the result of dereferencing the
corresponding iterator returns a value
testable as true. In other words, if
an algorithm takes Predicate pred as
its argument and first as its iterator
argument, it should work correctly in
the construct if (pred(*first)){...}
.
The function object pred
shall not
apply any non-constant function
through the dereferenced iterator.
This function object may be a pointer
to function, or an object of a type
with an appropriate function call
operator.
There's an analogous definition of BinaryPredicate
with two parameters.
So in English, it's a function or an object with a operator()
overload, that:
- takes a single parameter. In the case of algorithms, the parameter type is implicitly convertible from the type of the dereferenced iterator of the algorithm in question, or is a const reference to such a type, or at a push it can be a non-const reference to the exact type as long as the iterator isn't a const_iterator.
- returns a value that can be tested for truth in an
if
statement (and hence because of C++'s language rules, also in a while
loop and so on).
- doesn't modify its arguments (at least, not as long as the parameter type is const-correct...)
Additionally, since many algorithms don't specify the exact order of operations they perform, you might find that you get unpredictable behavior if your predicate isn't consistent, i.e. if the result depends on anything other than the input value that can change between calls.
As well as algorithms, the logical negator not1
in <functional>
takes a Predicate
template parameter. In that case, there's an extra requirement (20.3/5):
To enable adaptors and other
components to manipulate function
objects that take one or two arguments
it is required that the function
objects correspondingly provide
typedefs argument_type and result_type
for function objects that take one
argument and first_argument_type,
second_argument_type, and result_type
for function objects that take two
arguments.