266 __ Часть II. Программирование на C++
char* Function() ;
По-видимому, функция Function () должна возвращать char*. Если это функтор, то операция разыменования должна быть связана с именем функции, но компилятор связывает ее с возвращаемым значением. Значит для того, чтобы указать компилятору, что с чем связывать, надо расставить скобки.
char (*Function)() ;
Именно из-за этого функтор и выглядит так непривычно. В том случае, если функтор должен возвращать char*, необходимо поставить дополнительную звездочку к имени типа. Функтор с именем Function, возвращающий char*, выглядит следующим образом:
char* (*Function)() ;
Помимо звездочки и скобок до и после имени функции, все остальное у функтора такое же, как у функций. С тем, что получилось *в результате, можно обращаться и как с функцией, и как с переменной: функторам можно присваивать значения как переменным, и в то же время использовать как самую обычную функцию. О применении функторов будет рассказано далее.
Применение функторов
От функторов никуда не деться. Будете ли вы сами их создавать или нет, они в любом случае будут участвовать во взаимодействии ваших программ со средой Windows. C++ — язык чрезвычайно мощный. Вы уже видели, как в C++ используются аргументы по умолчанию; в дальнейшем вы научитесь перегружать функции и операции. Затем вы узнаете, как создавать функции-шаблоны (template functions), чтобы, написав одну функцию, работать с различными типами данных. Сейчас вы увидите, как написать алгоритм и изменять его работу с помощью только одной функции.
Листинг 11.1 невелик, так что уследить за происходящим будет легко. Программа использует для просмотра каталога функции findfirst и findnext. Функтор здесь нужен для того, чтобы пользователь мог задать те действия, которые будут связаны с этими функциями. С умеренными трудозатратами вы сами можете модернизировать этот пример так, чтобы просматривать весь диск целиком, просматривать несколько дисков, выбирать нужное действие в процессе работы и т. д.
1: // GENDIR.CPP — Эта программа использует функтор для
// различных операций над файлами в каталоге. 2: ftinciude <iostream.h>