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

В типе 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::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 ведет отсчет индексов начиная с нуля.

Операторы сравнения и равенства

Операторы сравнения и равенства кортежей ведут себя подобно соответствующим операторам контейнеров (см. раздел 9.2.7). Эти операторы выполняются для членов двух кортежей, слева и справа. Сравнить два кортежа можно только при совпадении количества их членов. Кроме того, чтобы использовать операторы равенства или неравенства, должно быть допустимо сравнение каждой пары членов при помощи оператора ==; а для использования операторов сравнения допустимым должно быть использование оператора <. Например:

tuple duo("1", "2");

tuple twoD(1, 2);

bool b = (duo == twoD); // ошибка: нельзя сравнить size_t и string

tuple threeD(1, 2, 3);

b = (twoD < threeD);    // ошибка: разное количество членов

tuple origin(0, 0);

b = (origin < twoD);    // ok: b — это true

Поскольку кортеж определяет операторы < и ==, последовательности кортежей можно передавать алгоритмам, а также использовать кортеж как тип ключа в упорядоченном контейнере.

Упражнения раздела 17.1.1

Упражнение 17.1. Определите кортеж, содержащий три члена типа int, и инициализируйте их значениями 10, 20 и 30.

Упражнение 17.2. Определите кортеж, содержащий строку, вектор строки и пару из строки и целого числа (типы string, vector и pair).

Упражнение 17.3. Перепишите программы TextQuery из раздела 12.3 так, чтобы использовать кортеж вместо класса QueryResult. Объясните, что на ваш взгляд лучше и почему.

<p>17.1.2. Использование кортежей для возвращения нескольких значений</p>

Обычно кортеж используют для возвращения из функции нескольких значений. Например, рассматриваемый книжный магазин мог бы быть одним из нескольких магазинов в сети. У каждого магазина был бы транзакционный файл, содержащий данные по каждой проданной книге. В этом случае могло бы понадобиться просмотреть все продажи данной книги по всем магазинам.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных