89. Корректно пишите функциональные объекты
89. Корректно пишите функциональные объекты
Резюме
Разрабатывайте функциональные объекты так, чтобы их копирование выполнялось как можно эффективнее. Там, где это возможно, делайте их максимально адаптируемыми путем наследования от unary_function или binary_function.
Обсуждение
Функциональные объекты моделируют указатели на функции. Подобно указателям на функции, они обычно передаются в функции по значению. Все стандартные алгоритмы передают объекты по значению, и то же должны делать и ваши алгоритмы, например:
template<class InputIter, class Func>
Function for_each(InputIter first, InputIter last, Function f);
Следовательно, функциональные объекты должны легко копироваться и быть мономорфными (для защиты от срезки), так что избегайте виртуальных функций (см. рекомендацию 54). Конечно, у вас могут быть большие и/или полиморфные функциональные объекты — их тоже вполне можно использовать; просто скройте их размер с помощью идиомы Pimpl (указателя на реализацию; см. рекомендацию 43). Эта идиома позволяет, как и требуется, получить внешний мономорфный класс малого размера, обеспечивающий доступ к богатой функциональности. Внешний класс должен удовлетворять следующим условиям.
• Быть адаптируемым. Наследуйте его от unary_function или binary_function.
• Использовать идиому Pimpl. Такой класс содержит указатель (например, shared_ptr) на (возможно, большого размера) реализацию необходимой функциональности.
• Иметь оператор(ы) вызова функции. Эти операторы передают вызовы объекту-реализации.
Этим ограничиваются требования к внешнему классу (не считая возможного наличия собственных (не генерируемых компилятором) конструкторов, оператора присваивания и/или деструктора.
Функциональные объекты должны быть адаптируемы. Стандартные связыватели и адаптеры полагаются на наличие определенных инструкций typedef, обеспечить которые легче всего при наследовании ваших функциональных объектов от unary_function или binary_function. Инстанцируйте unary_function или binary_function с теми типами, которые получает и возвращает ваш оператор operator() (при этом у каждого типа, не являющегося указателем, следует убрать все спецификаторы const верхнего уровня, а также все &).
Постарайтесь избежать наличия нескольких операторов operator(), поскольку это затрудняет адаптируемость. Дело в том, что обычно оказывается невозможно обеспечить корректные инструкции typedef, необходимые для адаптирования, поскольку один и тот же синоним типа, определяемый через инструкцию typedef, имеет разные значения для разных операторов operator().
Не все функциональные объекты являются предикатами — предикаты представляют собой подмножество функциональных объектов (см. рекомендацию 87).
Ссылки
[Allison98] §15, §C • [Austern99] §4, §8, §15 • [Gamma95] Bridge • [Josuttis99] §8.2.4 • [Koenig97] §21, §29 • [Meyers97] §34 • [Meyers01] §38, §40, §46 • [Musser01] §2.4, §8, §23 • [Sutter00] §26-30 • [Vandevoorde03] §22
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Необходимо корректно вкладывать элементы друг в друга
Необходимо корректно вкладывать элементы друг в друга Это требование стандарта XHTML не отличается от требований HTML. Каждый элемент, вложенный в другой элемент, должен быть закрыт завершающим тегом, лежащим внутри содержащего его элемента. Например, в данном примере
Пишите, Шура, пишите
Пишите, Шура, пишите Метки: темы блога, автор блога, маркетинг, пользовательский контентХороший маркетинг начинается с хорошего продукта. Блог компании – это тоже своего рода продукт, постоянно изменяемый автором. Складывается он из оформления, юзабилити и содержания.
Пишите для людей, а не для поисковых систем
Пишите для людей, а не для поисковых систем Осмелимся предположить, что Google и «Яндекс» вряд ли являются вашими покупателями. Скорее всего, ваша целевая аудитория – обычные люди. Поэтому не перенасыщайте описания товаров и другой контент тоннами ключевых слов с целью
Глава 2. Не пишите программу, когда можно записать макрос.
Глава 2. Не пишите программу, когда можно записать макрос. В этой главе ...~ Запись макросов - последовательностей команд, чтобы пользоваться ими снова и снова~ Запуск средства записи макросов~ Тонкости записи макросов: они должны работать так, как вы планировали~ Просмотр и
31. Не пишите код, который зависит от порядка вычислений аргументов функции
31. Не пишите код, который зависит от порядка вычислений аргументов функции РезюмеПорядок вычисления аргументов функции не определен, поэтому никогда не полагайтесь на то, что аргументы будут вычисляться в той или иной очередности.ОбсуждениеНа начальных этапах развития
67. Пишите максимально обобщенный код
67. Пишите максимально обобщенный код РезюмеИспользуйте для реализации функциональности наиболее обобщенные и абстрактные средства.ОбсуждениеКогда вы пишете тот или иной код, используйте наиболее абстрактные средства, позволяющие решить поставленную задачу. Всегда
71. Проектируйте и пишите безопасный в отношении ошибок код
71. Проектируйте и пишите безопасный в отношении ошибок код РезюмеВ каждой функции обеспечивайте наиболее строгую гарантию безопасности, какой только можно добиться без дополнительных затрат со стороны вызывающего кода, не требующего такого уровня гарантии. Всегда
88. В качестве аргументов алгоритмов и компараторов лучше использовать функциональные объекты, а не функции
88. В качестве аргументов алгоритмов и компараторов лучше использовать функциональные объекты, а не функции РезюмеПредпочтительно передавать алгоритмам функциональные объекты, а не функции, а компараторы ассоциативных контейнеров просто должны быть функциональными
Объекты DataSet с множеством таблиц и объекты DataRelation
Объекты DataSet с множеством таблиц и объекты DataRelation До этого момента во всех примерах данной главы объекты DataSet содержали по одному объекту DataTable. Однако вся мощь несвязного уровня ADO.NET проявляется тогда, когда DataSet содержит множество объектов DataTable. В этом случае вы можете
Функциональные клавиши
Функциональные клавиши Обычно вы посылаете команду ЭВМ, нажимая на клавишу с надписью enter (ввод), с/r (возврат каретки) или return (возврат). Названия клавиш иногда обозначаются прописными буквами. Пусть клавиша [enter] — [ввод]. Здесь квадратные скобки означают, что вы должны
Функциональные объекты
Функциональные объекты Функциональные объекты - это объекты, для которых определён operator(). Они важны для эффективного использования библиотеки. В местах, где ожидается передача указателя на функцию алгоритмическому шаблону, интерфейс установлен на приём объекта с
3.3.1 Функциональные возможности
3.3.1 Функциональные возможности a) Установка (инсталляция)Если установка пакета может быть выполнена пользователем, то при ее проведении должна быть обеспечена возможность успешной установки программ в соответствии с информацией, содержащейся в руководстве по
Софтерра: Корректно о цвете кожи
Софтерра: Корректно о цвете кожи Автор: Алексей КлимовПарадигма обработки изображений в рассматриваемых сегодня программах iCorrect EditLab Pro и iCorrect Portrait настолько спорна, что требует вступительного слова на тему «Цвет кожи как часть выражения лица».Дело в том, что в цифровых
4.1.2. Функциональные клавиши
4.1.2. Функциональные клавиши В верхней части клавиатуры размещено 12 (от F1 до F12) функциональных клавиш (рис. 30). Функции, выполняемые этими клавишами, зависят от работающей в данный момент программы, т. е. реакцию на нажатие каждой функциональной клавиши задает программист.
Глава 9 Пишите письма
Глава 9 Пишите письма Иногда мне приходят такие электронные письма, что я готов порвать их на мелкие электроны! Б. Гейтс. Из личной переписки Краткое содержание• Электронный почтовый ящик• Почта Windows как она есть• Домашнее задание 9Путешествия по Интернету интересуют