На этом шаге мы перечислим дополнительные композиционные адаптеры.
Возможность объединения объектов функций играет важную роль в построении программного кода из готовых компонентов.
Композиция позволяет конструировать очень сложные объекты функций из более простых частей. Конечно, было бы очень полезно,
чтобы практически любое функциональное отношение представлялось в виде комбинации объектов функций. К сожалению, набор
адаптеров в стандартной библиотеке C++ недостаточно широк. Например, не существует адаптера, который бы позволял
объединить две унарные операции для формулировки критерия вида "одно и другое".
Теоретически в библиотеке пригодились бы следующие композиционные адаптеры.
- f(g(elem)). Общая форма унарной композиции - вложенные вызовы унарных предикатов, при которых результаты вызова
предиката g() являются входными данными для предиката f(). Все выражение работает как унарный предикат. - f(g(elem1,elem2)). Два элемента elem1 и elem2 передаются в аргументах бинарного предиката g(),
а результаты, как и в предыдущем случае, являются входными данными для унарного предиката f(). Все выражение работает
как бинарный предикат. - f(g(elem),h(elem)). Элемент elem передается двум разным унарным предикатам g() и h(), а
результаты обрабатываются бинарным предикатом f(). Все выражение работает как унарный предикат. - f(g(elem1),h(elem2)). В этой форме два элемента elem1 и elem2 передаются двум разным унарным предикатам
g() и h(), а результаты обрабатываются бинарным предикатом f(). Все выражение работает как бинарный
предикат.
К сожалению, эти композиционные адаптеры не были стандартизированы, поэтому для них не существуют стандартных имен. В
реализации STL от SGI были определены имена для двух из перечисленных адаптеров, однако сообщество
программистов еще не выбрало наиболее подходящие. В таблице 1 приведены имена, которые мы будем использовать далее.
Таблица 1. Возможные имена композиционных адаптеров
Функциональность | В шагах | В реализации STL от SGI |
---|---|---|
f(g(elem)) | compose_f_gx | compose1 |
f(g(elem1,elem2)) | compose_f_gxy | |
f(g(elem),h(elem)) | compose_f_gx_hx | compose2 |
f(g(elem1),h(elem2)) | compose_f_gx_hy |
В архиве библиотек C++ Boost (http://www.boost.org) можно найти как имена,
которые должны использоваться в будущем, так и их полную реализацию. В следующих шагах описаны три наиболее часто использующиеся адаптера.
Со следующего шага мы будем рассматривать унарные композиционные адаптеры.