Категории
Самые читаемые
Лучшие книги » Компьютеры и Интернет » Программирование » Язык программирования C++. Пятое издание - Стенли Липпман

Язык программирования C++. Пятое издание - Стенли Липпман

Читать онлайн Язык программирования C++. Пятое издание - Стенли Липпман

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 237 238 239 240 241 242 243 244 245 ... 297
Перейти на страницу:

Глава 18 завершается очень важным, но нечасто используемым средством языка: множественным наследованием. Множественное наследование наиболее полезно в сложных иерархиях наследования.

Глава 19 посвящена ряду специализированных подходов и инструментальных средств решения ряда специфических проблем. В этой главе рассматриваются такие средства, как дополнительные возможности по распределению памяти; поддержка языком С++ идентификации типов времени выполнения (RTTI), позволяющей определять фактический тип выражения во время выполнения; а также способы определения и использования указателей на члены класса. Указатели на члены классов отличаются от указателей на обычные данные или функции. Обычные указатели различаются только на основании типа объекта или функции. Указатели на члены класса должны также отражать класс, которому принадлежит член. Затем рассматриваются три дополнительных составных типа: объединения, вложенные и локальные классы. Глава завершается кратким обзором средств, применение которых делает код непереносимым. Сюда относится спецификатор volatile, битовые поля и директивы компоновки.

Глава 17

Специализированные средства библиотек

Последний стандарт существенно увеличил размер и область видимости библиотеки. Действительно, посвященная библиотеке часть стандарта более чем удвоилась по сравнению с прежним выпуском стандарта и составила почти две трети текста нового стандарта. В результате подробное рассмотрение каждого класса библиотеки С++ стало невозможным в данном издании. Однако четыре специализированных библиотечных средства являются достаточно общими, чтобы рассмотреть их в данной книге: это кортежи, наборы битов, генераторы случайных чисел и регулярные выражения. Кроме того, будут рассмотрены также некоторые дополнительные специальные средства библиотеки ввода и вывода.

17.1. Тип tuple

Шаблон tuple (кортеж) подобен шаблону pair (пара) (см. раздел 11.2.3). У каждого экземпляра шаблона pair могут быть члены разных типов, но их всегда только два. Члены экземпляров шаблона tuple также могут иметь разные типы, но количество их может быть любым. Каждый конкретный экземпляр шаблона tuple имеет фиксированное количество членов, но другой экземпляр типа может отличаться количеством членов.

Тип tuple особенно полезен, когда необходимо объединить некие данные в единый объект, но нет желания определять структуру для их хранения. Список операций, поддерживаемых типом tuple, приведен в табл. 17.1. Тип tuple, наряду с сопутствующими ему типами и функциями, определен в заголовке tuple.

Таблица 17.1. Операции с кортежами

tuple<T1, T2, ..., Tn> t; t — кортеж с количеством и типами членов, заданными списком T1...Tn. Члены инициализируются по умолчанию (см. раздел 3.3.1) tuple<T1, T2, ..., Tn> t(v1, v2, ..., vn); t — кортеж с типами T1...Tn, каждый член которого инициализируется соответствующим инициализатором vi. Этот конструктор является явным (см. раздел 7.5.4) make_tuple(v1, v2, ..., vn) Возвращает кортеж, инициализированный данными инициализаторов. Тип кортежа выводится из типов инициализаторов t1 == t2 t1 != t2 Два кортежа равны, если у них совпадает количество членов и каждая пара членов равна. Для сравнения используется собственный оператор == каждого члена. Как только найдены неравные члены, последующие не проверяются t1 опсравн t2 Операторы сравнения кортежей используют алфавитный порядок (см. раздел 9.2.7). У кортежей должно быть одинаковое количество членов. Члены кортежа t1 сравниваются с соответствующими членами кортежа t2 при помощи оператора < get<i>(t) Возвращает ссылку i-ю переменную-член кортежа t; если t — это l-значение, то результат — ссылка на l-значение; в противном случае — ссылка на r-значение. Все члены кортежа являются открытыми (public) tuple_size<типКортежа>::value Шаблон класса, экземпляр которого может быть создан по типу кортежа и имеет public constexpr static переменную-член value типа size_t, содержащую количество членов в указанном типе кортежа tuple_element<i, типКортежа>::type Шаблон класса, экземпляр которого может быть создан по целочисленной константе и типу кортежа, имеющий открытый член type, являющийся типом указанного члена в кортеже указанного типа

Тип tuple можно считать структурой данных на "скорую руку".

17.1.1. Определение и инициализация кортежей

При определении кортежа следует указать типы каждого из его членов:

tuple<size_t, size_t, size_t> threeD; // все три члена установлены в 0

tuple<string, vector<double>, int, list<int>>

 someVal("constants", {3.14, 2.718}, 42, {0,1,2,3,4,5});

При создании объекта кортежа можно использовать либо стандартный конструктор кортежа, инициализирующий каждый член по умолчанию (см. раздел 3.3.1), либо предоставить инициализатор для каждого члена, как при инициализации кортежа someVal. Этот конструктор кортежа является явным (см. раздел 7.5.4), поэтому следует использовать прямой синтаксис инициализации:

tuple<size_t, size_t, size_t> threeD = {1,2,3}; // ошибка

tuple<size_t, size_t, size_t> threeD{1,2,3};    // ok

В качестве альтернативы, подобно функции make_pair() (см. раздел 11.2.3), можно использовать библиотечную функцию make_tuple(), создающую объект кортежа:

// кортеж, представляющий транзакцию приложения книжного магазина:

// ISBN, количество, цена книги

auto item = make_tuple("0-999-78345-X", 3, 20.00);

Подобно функции make_pair(), функция make_tuple() использует типы, предоставляемые в качестве инициализаторов, для вывода типа кортежа. В данном случае кортеж item имеет тип tuple<const char*, int, double>.

Доступ к членам кортежа

В типе pair всегда есть два члена, что позволяет библиотеке присвоить им имена first (первый) и second (второй). Для типа tuple такое соглашение об именовании невозможно, поскольку у него нет ограничений на количество членов. В результате члены остаются безымянными. Вместо имен для обращения к членам кортежа используется библиотечный шаблон функции get. Чтобы использовать шаблон get, следует определить явный аргумент шаблона (см. раздел 16.2.2), задающий позицию члена, доступ к которому предстоит получить. Функция get() получает объект кортежа и возвращает ссылку на его заданный член:

auto book = get<0>(item);      // возвращает первый член item

auto cnt = get<1>(item);       // возвращает второй член item

auto price = get<2>(item)/cnt; // возвращает последний член item

get<2>(item) *= 0.8;           // применяет 20%-ную скидку

Значение в скобках должно быть целочисленным константным выражением (см. разделе 2.4.4). Как обычно, счет начинается с 0, а значит, первым членом будет get<0>.

Если подробности типов в кортеже неизвестны, для выяснения количества и типов его членов можно использовать два вспомогательных шаблона класса:

typedef decltype(item) trans; // trans - тип кортежа item

// возвращает количество членов в объекте типа trans

size_t sz = tuple_size<trans>::value;             // возвращает 3

// cnt имеет тот же тип, что и второй член item

tuple_element<1, trans>::type cnt = get<1>(item); // cnt - это int

Для использования шаблонов tuple_size и tuple_element необходимо знать тип объекта кортежа. Как обычно, проще всего определить тип объекта при помощи спецификатора decltype (см. раздел 2.5.3). Здесь спецификатор decltype используется для определения псевдонима для типа кортежа item, который и используется при создании экземпляров обоих шаблонов.

Шаблон tuple_size обладает открытой статической переменной-членом value, содержащей количество членов в указанном кортеже. Шаблон tuple_element получает индекс, а также тип кортежа. Он обладает открытым типом-членом type, содержащим тип указанного члена кортежа заданного типа. Подобно функции get(), шаблон tuple_element ведет отсчет индексов начиная с нуля.

1 ... 237 238 239 240 241 242 243 244 245 ... 297
Перейти на страницу:
На этой странице вы можете бесплатно скачать Язык программирования C++. Пятое издание - Стенли Липпман торрент бесплатно.
Комментарии