268______________________________Часть II. Программирование на C++

В строке 14 на каждом шаге цикла while вызывается функция, на которую указывает аргумент Functor.

Строки 19 и 25 содержат интерфейсы двух функций, созданных для демонстрации функторов. Первая функция записывает имена соответствующих маске файлов в устройство вывода, а вторая — подсчитывает суммарное дисковое пространство, занимаемое этими файлами.

Строки 31 и 33 показывают пример передачи функтора в качестве аргумента. Они не требуют никакого специального синтаксиса и передаются точно так же, как и любые другие переменные аргументы.

Результатом работы этой программы являются список файлов корневого каталога диска С и суммарный размер занимаемого ими дискового пространства. Сделайте для этого модуля заголовок, и его с успехом можно будет использовать в любых других программах. Стоит заметить, что у вас вряд ли возникнет необходимость в модификации самой функции

TraverseDirectory.

Совет

Существует несколько способов усовершенствования этой программы. Во-первых, можно перегрузить функцию с тем, чтобы она могла принимать различные функторы (см. главу 15 "Перегрузка функций"). Во-вторых, функцию можно превратить в функцию-шаблон, что предпочтительнее. В этом случае можно задать тип функтора как аргумент-шаблон (см. главу 19 "Классы-шаблоны").

Упрощение сложных типов данных

В главе 9 "Описатели и спецификаторы данных" вы познакомились с ключевым словом typedef. Это ключевое слово может быть использовано для введения псевдонимов, упрощающих программу путем замены сложных объявлений типов более простыми синонимами (обратную подстановку компилятор производит сам). Это средство весьма полезно при определении функторов.

Тип функтора можно упростить, используя ключевое слово typedef. Обычное применение этого слова имеет такой вид:

typedef old type alias name

Например, оператор

!

typedef char far *pChar;

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