Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VC_Lect.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
14.76 Mб
Скачать

21.3.Функциональные объекты

Функциональные объекты – это объекты, для которых определён operator(), т.е. перегружена операция круглые скобки. Эти объекты называют также объектами-функциями. Они важны для эффективного использования библиотеки. В местах, где ожидается передача указателя на функцию алгоритмическому шаблону, интерфейс установлен на приём объекта с определённым operator(). Это не только заставляет алгоритмические шаблоны работать с указателями на функции, но также позволяет им работать с произвольными функциональными объектами. Использование функциональных объектов вместе с функциональными шаблонами увеличивает выразительную мощность библиотеки также, как делает результирующий код более эффективным.

Например, если мы хотим поэлементно сложить два вектора a и b, содержащие double, и поместить результат в a, мы можем сделать зто так:

transform(a.begin(), a.end(), b.begin(), b.end(), plus<double>());

Приведем простейший пример определения и применения функционального объекта без использования библиотечных алгоритмов:

using namespace std;

template <class T>

class Print

{

public:

void operator()(T& arg1)

{ cout<< arg1<<' '; }

};

int main()

{

Print <int> DoPrint; // DoPrint – функциональный объект

for(int i=0;i<5;i++) DoPrint(i);

return 0;

}

Эта программа выведет на монитор числа от 0 до 4.

В данном примере шаблонный класс Print содержит определение только одной функции, перегружающей операцию (), хотя такой класс может иметь как член-данные, так и другие член-функции.

Функциональные объекты могут использоваться алгоритмами STL для выполнения различных действий над контейнерами. Существует три типа функциональных объектов:

генераторы – функциональные объекты, не имеющие аргументов. Классический пример – генератор случайных чисел;

унарные функции – функциональные объекты, имеющие один аргумент. Примером такого объекта является DoPrint;

бинарные функции – функциональные объекты, имеющие два аргумента.

Все типы объектов-функций могут иметь возвращаемое значение, а могут и не иметь. Если тип возвращаемого значения булевский, то функциональный объект называют предикатом.

Чтобы позволить адаптерам и другим компонентам манипулировать функциональными объектами, которые используют один или два параметра, требуется, чтобы они соответственно обеспечили определение типов (typedefs):

argument_type и result_type для функциональных объектов, которые используют один параметр;

first_argument_type, second_argument_type и result_type для функциональных объектов, которые используют два параметра.

В заголовочном файле <functional> определены шаблоны стандартных классов, которые помогают стандартизировать и упростить описание функциональных объектов:

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;

};

С учетом приведенных шаблонов класс Print можно описать так:

template <class T>

class Print : public unary_function<T, void>

{

public:

void operator()(T& arg1)

{ cout<< arg1<<' '; }

};

Библиотека STL обеспечивает базовые классы функциональных объектов для:

  • арифметических операций языка (arithmetic operations);

  • операций сравнения (comparisons);

  • логических операций (logical operations).

Их описание см. в разделе «Функциональные объекты» [5]. Шаблоны для операций сравнения позволяют стандартизировать описание функциональных объектов предикатов.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]