Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 15
На сайте нет зарегистрированных пользователей

Пользователей: 13,361
новичок: uehuat
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

База данных склада на Delphi + Схема БД
моделирование процесса поступления заявок в ЭВМ на GPSS + Пояснительная ...
Двунаправленный динамический список на Delphi + Блок схемы

Адаптеры функторов
Реализация функтора Greater не является универсальной в данном случае — он «адаптирован» под нашу функцию-фильтр cofly_if (). «Адаптация» состоит в том, что мы вообще-то бинарный предикат «больше» превратили в унарный, задав один из аргументов как аргумент операции operator (), а другой — в виде поля класса. Причем мы фиксируем значение этого аргумента при создании объекта-функции. Таким образом, при вызове функтора в теле copyi f () ему передается только один аргумент — элемент контейнера. Второй инкапсулирован в функторе, и его значение зафиксировано при конструировании функтора.
Можно пойти по другому пути: написать универсальный бинарный функтор-предикат Greater и попытаться использовать его в качестве аргумента функции copyi f (). Возможная реализация представлена в листинге 12.12.

Листинг 12.12. Универсальный функтор «больше»
template<class Туре> struct Greater
{ 6ool operator()(const Туре& Left, const Туре& Right) const { return (Left > Right); }
};



Однако мы не сможем непосредственно использовать такой функтор в функции copyi f () — аргументов у него два. Тогда зачем нам «прелести» универсальности? Вообще-то в нашем конкретном случае дальнейшее обобщение выглядит лишним. Однако торопиться с выводами не следует. Этот предикат может пригодиться для других обобщенных алгоритмов (например, для сортировки), так как способен работать с любым классом, в котором реализован конструктор по умолчанию и операция «больше». Например, его вполне можно использовать для сравнения строк, если в классе строк перегружена операция operator >.
Поэтому мы все-таки попробуем задействовать этот универсальный предикат. Нам нужно каким-то образом «избавиться» от одного ир аргументов, оставив только второй. Предыдущая версия Greater подсказывает нам решение: нужно написать класс-адаптер, в котором один из аргументов предиката задается как аргумент конструктора. Таким образом, мы превратим бинарный предикат в унарный. Адаптеров должно быть два — разные для первого и второго аргументов. Кроме того, в качестве параметра, очевидно, должен передаваться и сам бинарный предикат. Реализация представлена в листинге 12.13.
Классы достаточно простые, но мы наблюдаем еще одну не совсем обычную деталь — поле-функтор, заполняемое конструктором. Соответствующий параметр передается конструктору по константной ссылке. Конечно, то же самое можно сделать и с указателем на функцию, но в объектно-ориентированном программировании все же привычнее работать с объектами.

Листинг 12.13. Адаптеры-фиксаторы аргументов бинарного предиката
template<class Predicate, class Т> class firstarg { public:
firstarg(const Predicate& P, const T& Left) : op(P), value(Left) { }
bool operator()(const T& Right) const
{ return (op(value, Right)); // реальный вид предиката

private:
Predicate op; Т value;

// предикат
// фиксированный аргумент

}:
template<class Predicate, class T> class secondarg { public:
secondarg(const Predicate& P, const T& Right) : op(P), value(Right) { }
bool operator()(const T& Left) const
{ return (op(Left, value)); // реальный вид предиката
}
private:
Predicate op; T value;



Опубликовал Kest January 13 2014 11:16:25 · 1 Комментариев · 5625 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
quest_ak47s January 18 2014 09:20:09
А ведь адаптеры функторов это легкая часть программирования! Спасибо автору за инфу! Я так и не мог найти толкового объяснения по этому поводу. На других сайтах все пишется так, что нужно перечитать еще кучу-другую статей.А тут все без всяких волшелбных палочек понятно. Статья честная познавательная и интересная. Спасибо!
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Защита от спама ...
Пример создания W...
DelTrayIcon [Исхо...
Редактор текста (...
FilesInfo
Delphi 6/7 базы д...
Профессиональное ...
Эффект лампы на р...
IconCut [Исходник...
RxLIB
TmxOutlookBarPro
Создание оригинал...
Анимированное поя...
Программирование ...
Animated Menus
DAlarm
Основы Delphi. Пр...
XPATComponents
С# для профессион...
Delphi World 6.0

Топ загрузок
Приложение Клие... 100772
Delphi 7 Enterp... 97809
Converter AMR<-... 20260
GPSS World Stud... 17014
Borland C++Buil... 14189
Borland Delphi ... 10267
Turbo Pascal fo... 7372
Калькулятор [Ис... 5972
Visual Studio 2... 5206
Microsoft SQL S... 3661
Случайные статьи
Двоичная композиция
Процедура sort в с...
Время и материалы
Протокол SNMP
Ходы
Окна, шрифт
Плохая функция: ве...
Комментарии в языке С
Драйвер seg_vn
Методы и их резуль...
Автоматическое р...
Где купить постель...
Поиск значений
Применение протоко...
Развертывание дере...
Элементы управлени...
Видеоприложения со...
Где купить песок Д...
Термин «инфографика»
Требования к меню ...
OpenGL. Пример рис...
ОБРАЗОВАНИЕ ПЛОТНО...
Некоторые выводы в...
Виртуальное казино...
Архитектура Ethern...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?