Навигация
Главная
Поиск
Форум
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
Реклама
Сейчас на сайте
Гостей: 23
На сайте нет зарегистрированных пользователей

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

Информационная система - продуктовый магазин на Turbo Pascal (База данны...
Программа тестирования и обучающая программа по математике на Turbo Pasc...
База данных студентов на Turbo Pascal (Списки) + Пояснительная записка

Адаптеры функторов
Реализация функтора 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 Комментариев · 5656 Прочтений · Для печати

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


Комментарии
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...
Шаблон для новост...

Случайные загрузки
Strawberry Prolog...
Создание оригинал...
Калькулятор [Исхо...
Быстрое создание ...
Delphi 7: Для про...
DemoEdit [Исходни...
Библия хакера 2. ...
Run
CoolHints2k v1.03
Просмотр коммент...
Измерение тактово...
DateEdit
DateEdit
Сложный калькулятор
PDJXPPack
SUIPack
OnlineIP
MPTools
Delphi 6. Учебный...
Анекдоты с ostrie.ru

Топ загрузок
Приложение Клие... 100774
Delphi 7 Enterp... 97839
Converter AMR<-... 20268
GPSS World Stud... 17014
Borland C++Buil... 14193
Borland Delphi ... 10293
Turbo Pascal fo... 7374
Калькулятор [Ис... 5984
Visual Studio 2... 5207
Microsoft SQL S... 3661
Случайные статьи
Функция ввода даты
Стратегии эффектив...
Формирование струк...
Eldorado casino зе...
Формат и типы сооб...
Web Основы с LWP
Аннотация
Операции над списк...
Официальный сайт В...
NESSUS - современн...
Свойства информаци...
Выбор ключевых сло...
Unknown Identifier
Спил деревьев
Необходимые типы д...
Соединение сетевых...
Правильное тестиро...
6.1. ЦЕЛЬ: ПОДДЕРЖ...
Выполнение агрегир...
Описание подмодуля...
Альтернатива униве...
УПРАВЛЕНИЕ ВЫПОЛНЕ...
Программирование: ...
4.1. ЦЕЛЬ: СОЗДАНИ...
Изменение звуковой...
Статистика



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


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