Именованные требования C++: Предикат
Требования Predicate описывают вызываемый объект, который возвращает значение BooleanTestable.
Предикат обычно используется с алгоритмами, которые принимают входные данные (отдельные объекты/контейнеры) и предикат, вызываемый для входных данных, чтобы определить дальнейшие действия. Примеры использования предикатов в стандартной библиотеке C++:
-
std::all_of,std::any_of,std::none_ofПринимают массив элементов и предикат в качестве входных данных. Вызывают предикат для отдельных входных элементов и возвращают true, если предикат возвращает true для всех/любых/ни одного из элементов. -
std::find_ifПринимает последовательность элементов и предикат. Возвращает первый элемент последовательности, для которого предикат возвращает значение, равноеtrue.
Приведённое выше описание возможностей алгоритмов является упрощённым и предназначено для объяснения понятия «Предикат» простыми словами. Подробную информацию см. на страницах соответствующих алгоритмов.
Иными словами, если алгоритм принимает предикат pred и итератор first, он должен иметь возможность проверить объект типа, на который указывает итератор first, используя заданный предикат с помощью конструкции вида if (pred(*first)) { /*...*/ }.
Функциональный объект pred не должен вызывать никаких неконстантных функций через разыменованный итератор и должен принимать аргумент const, ведя себя одинаково независимо от того, является ли аргумент const или не-const. Этим функциональным объектом может быть указатель на функцию или объект типа с подходящим оператором вызова функции.
Требования
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были ретроактивно применены к ранее опубликованным стандартам C++.
| Отчёт об ошибке | Применяется к | Опубликованное поведение | Правильное поведение |
|---|---|---|---|
| LWG 3031 | C++98 | требования к значениям const были недостаточными | требования усилены |
См. также
|
(C++20) | указывает, что вызываемый тип является булевым предикатом (концепт) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/named_req/Predicate