На этом шаге мы рассмотрим использование функциональных адаптеров для обычных функций.
Функциональный адаптер ptr_fun позволяет использовать обычные функции с другими функциональными адаптерами (таблица 1).
Выражение | Описание |
---|---|
ptr_fun(op) | *op(param) |
*op(param1,param2) |
Предположим, имеется глобальная функция, которая проверяет некоторое условие для передаваемого параметра:
bool check(int elem);
Поиск первого элемента, для которого проверка завершается неудачей, производится следующей командой:
pos = find_if (coll.begin(), coll.end(), // Интервал not1(ptr_fun(check))); // Критерий поиска
Применить конструкцию not1(check) нельзя, поскольку not1() использует специальные типы, предоставляемые объектами функций.
Вторая форма используется в ситуации, когда глобальная функция вызывается с двумя параметрами, а вам, например, она нужна как унарная функция:
// Поиск первой непустой строки pos = find_if (coll.begin(), coll.end(), // Интервал bind2nd(ptr_fun(strcmp),"")); // Критерий поиска
В этом фрагменте функция strcmp() языка С сравнивает каждый элемент с пустой строкой языка С. Если строки совпадают, функция strcmp() возвращает 0 (эквивалент false). Таким образом, данный вызов find_if() возвращает позицию первого элемента, отличного от пустой строки.
На следующем шаге мы рассмотрим написание пользовательских объектов функций для функциональных адаптеров.