|
Программирование >> Операторы преобразования типа
/* Класс функции-предиката * - оператор () сравнивает два объекта Person */ class PersonSortCriterion ( public: Действительно, такое определение более сложно, однако у него есть три важных преимущества. О Объект функции ведет себя более разумно, потому что может обладать состоянием. Например, можно создать два экземпляра одной функции, представленной объектом функции, которые могут одновременно обладать разными состояниями. Для обычных функций это невозможно. О Каждый объект функции обладает некоторым типом. Это означает, что вы можете передать объект функции шаблону, определяя какие-то аспекты его поведения, а контейнеры с разными объектами функций будут считаться относящимися к разным типам. О Объект функции обычно работает быстрее указателя на функцию. На с. 136 эти преимущества описаны более подробно, а пример на с. 137 показывает, что объект функции умнее обычной функции. Далее приводятся два примера работы с объектами функций. В нервом примере используется тот факт, что каждый объект функции обычно обладает собственным типом. Второй пример показывает, как задействовать состояние объекта функции, а также демонстрирует одно интересное свойство алгоритма for each(). Объект функции в качестве критерия сортировки Программисты часто работают с сортированными коллекциями элементов, относящихся к определенному классу (например, с коллекцией объектов Person). Но предположим, сортировка объектов должна осуществляться не обычным оператором <, а по специальному критерию, оформленному в виде функции. В таких случаях на помощь приходят объекты функций. Рассмотрим следующий пример: fo/sortl.cpp #1nclude <iostream> #include <string> #1nclude <5et> #1nclude <algorithm> using namespace std; class Person { public: string firstname const: string lastname const; Выполнение операций с элементами PersonSet::iterator pos; for (pos = coll .beginO; pos != coll .end(); ++pos) ( Множество coll использует специальный критерий сортировки PersonSortCriterion, определенный в виде объекта функции. PersonSortCriterion определяет оператор () так, что он сравнивает два объекта Person по полю фамилии, а если они равны - по имени. Конструктор соП автоматически создает экземпляр класса PersonSortCriterion, чтобы элементы сортировались в соответствии с этим критерием. Обратите внимание: критерий сортировки PersonSortCriterion является типом. Следовательно, он может передаваться в аргументе шаблона множества. Если бы критерий был оформлен в виде обычной функции (как па с. 133), это было бы невозможно. Все множества с данным критерием сортировки образуют отдельный тип (в данном примере он называется PersonSet). Они не могут использоваться совместно с множествами, имеющими обычный* или другой пользовательский критерий сортировки (в том числе участвовать в операциях присваивания). Это означает, что никакая операция с множеством не приведёт к нарушению автоматической сортировки; впрочем, можно написать объект функции, представляющий разные критерии сортировки с одним типом (см. следующий подраздел). За дополнительной информацией о множествах и их критериях сортировки обращайтесь на с. 186. bool OperatorO (const Person& pi. const Person& p2) const { /* Первый объект Person меньше второго. * - если фамилия в первом объекте меньше фамилии во втором объекте: * - или если фамилии равны, а имя в лервом объекте меньше. */ return pl.lastname()<p2.lastnameO (! (р2.lastnameO<pl. lastname()) && pi.f1rstname()<p2.fi rstnameC)); int maInO Объявление типа множества со специальным критерием сортировки typedef set<Person.PersonSortCr1ter1on> PersonSet; Создание коллекции PersonSet col 1: Объекты функций с внутренним состоянием в следующем примере показано, как при помощи объекта функции имитировать функцию, обладающую несколькими состояниями одновременно. fo/general,cpp #1nclude <iostream> #inc1ude <1ist> #1nclude <algorithin> #include print.hpp using namespace std: class IntSequence { private: int value; public: Конструктор IntSequence (int initialValue) : valuednitialValue) { Вызов функции int operatorO C) { return value++; int mainO ( list<int> coll; Вставка значений от 1 до 9 generate n Cback inserterCcol1). Начало 9, Количество элементов IntSequence(l)}; Генератор значений PRINT ELEMENTS(coll); Замена элементов от второго до предпоследнего значениями. начинающимися с 42 generate С++со11.beginC). Начало --coll.endC), Конец IntSequence(42)); Генератор значений PRINT ELEMENTSCcoll): В данном примере объект функции генерирует последовательность целых чисел. При каждом вызове оператор () возвращает текущее значение счетчика
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |