|
|
[ Назад ] [ Содержание ] [ Вперед ]
Функциональные объекты - это объекты, для которых определён operator(). Они важны для эффективного использования библиотеки. В местах, где ожидается передача указателя на функцию алгоритмическому шаблону, интерфейс установлен на приём объекта с определённым operator(). Это не только заставляет алгоритмические шаблоны работать с указателями на функции, но также позволяет им работать с произвольными функциональными объектами. Использование функциональных объектов вместе с функциональными шаблонами увеличивает выразительную мощность библиотеки также, как делает результирующий код более эффективным. Например, если мы хотим поэлементно сложить два вектора a и b, содержащие double, и поместить результат в a, мы можем сделать зто так:
transform(a.begin(), a.end(), b.begin(), a.begin(), plus<double>());
Если мы хотим отрицать каждый элемент a, мы можем сделать это так:
transform(a.begin(), a.end(), a.begin(), negate<double>());
Соответствующие функции вставят сложение и отрицание.
Чтобы позволить адаптерам и другим компонентам манипулировать функциональными объектами, которые используют один или два параметра, требуется, чтобы они соответственно обеспечили определение типов (typedefs) argument_type и result_type для функциональных объектов, которые используют один параметр, и first_argument_type, second_argument_type и result_type для функциональных объектов, которые используют два параметра.
Следующие классы предоставляются, чтобы упростить определение типов (typedefs) параметров и результата:
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; };
Библиотека обеспечивает базовые классы функциональных объектов для всех арифметических операторов языка.
template <class T> struct plus : binary_function<T, T, T> { Т operator()(const T& x, const T& y) const { return x + y; } }; template <class T> struct minus : binary_function<T, T, T> { Т operator()(const T& x, const T& y) const { return x - y; } }; template <class T> struct times : binary_function<T, T, T> { Т operator()(const T& x, const T& y) const ( return x * y; } }; template <class T> struct divides : binary_function<T, T, T> { Т operator()(const T& x, const T& y) const { return x / y; } }; template <class T> struct modulus : binary_function<T, T, T> { Т operator()(const T& x, const T& y) const { return x % y; } }; template <class T> struct negate : unary_function<T, T> { Т operator()(const T& x) const { return -x; } };
Библиотека обеспечивает базовые классы функциональных объектов для всех операторов сравнения языка
template <class T> struct equal_to : binary_function<T, T, bool> { bool operator()(const T& x, const T& y) const { return x == y; } }; template <class T> struct not_equal_to : binary_function<T, T, bool> { bool operator()(const T& x, const T& y) const { return x != y; } }; template <class T> struct greater : binary_function<T, T, bool> { bool operator()(const T& x, const T& y) const { return x > y; } }; template <class T> struct less : binary_function<T, T, bool> { bool operator()(const T& x, const T& y) const { return x < y; } }; template <class T> struct greater_equal : binary_function<T, T, bool> { bool operator()(const T& x, const T& y) const { return x >= y; } }; template <class T> struct less_equal : binary_function<T, T, bool> { bool operator()(const T& x, const T& y) const { return x <= y; } };
template <class T> struct logical_and : binary_function<T, T, bool> { bool operator()(const T& x, const T& y) const { return x && y; } }; template <class T> struct logical_or : binary_function<T, T, bool> { bool operator()(const T& x, const T& y) const { return x || y; } }; template <class T> struct logical_not : unary_function<T, bool> { bool operator()(const T& x) const { return !x; } };
[ Назад ] [ Содержание ] [ Вперед ]