`
Читать книги » Книги » Компьютеры и Интернет » Программирование » Д. Стефенс - C++. Сборник рецептов

Д. Стефенс - C++. Сборник рецептов

1 ... 132 133 134 135 136 ВПЕРЕД
Перейти на страницу:

 initialize(v) = 0, 1, 1, a, 3, b, 8, 13;

 cout << v[3] << endl; // выдает 2

 system("pause");

 return EXIT_SUCCESS;

}

Обсуждение

Часто стандартные последовательности инициализируются путем вызова несколько раз функции-члена push_back. Поскольку это приходится делать не так уж редко, я написал функцию initialize, которая помогает избавиться от этого скучного занятия, позволяя выполнять инициализацию значениями, разделяемыми запятыми, подобно тому как это делается во встроенных массивах.

Возможно, вы и не знали, что запятая является оператором, который можно переопределять. Здесь вы не одиноки — этот факт не является общеизвестным. Оператор запятой было разрешено перегружать почти только ради решения этой задачи.

В решении используется вспомогательная функция initialize, которая возвращает шаблон вспомогательной функции comma_helper. Этот шаблон содержит ссылку на последовательность и перегруженные операторы operator,, operator= и operator+=.

Такое решение требует, чтобы я определил отдельную вспомогательную функцию из-за особенностей восприятия компилятором оператора v = 1, 1, 2, ...;. Компилятор рассматривает v = 1 как недопустимое подвыражение, потому что в стандартных последовательностях не поддерживается оператор присваивания единственного значения. Функция initialize конструирует соответствующий объект comma_helper, который может хранить последовательность, используемую в перегруженном операторе присваивания и запятой.

Оператор запятой (comma operator), называемый также оператором последовательности (sequencing operator), по умолчанию рассматривает выражения слева направо, и в результате получается значение и тип самого правого значения. Однако при перегрузке operator принимает новый смысл и теряет первоначальную семантику. Здесь возникает один тонкий момент — оценка параметров слева направо теперь не гарантируется, и результат выполнения программного кода, приведенного в примере 15.7, может оказаться неожиданным.

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

int prompt_user() {

 cout << "give me an integer ... ";

 cin >> n;

 return n;

}

void f() {

 vector<int> v;

 // Следующий оператор может инициализировать v в неправильной

 // последовательности

 intialize(v) = prompt_user(), prompt_user();

}

В правильном варианте функции f каждый вызов prompt_user должен был бы выполняться в отдельном операторе.

Библиотека Boost Assign, написанная Торстеном Оттосеном (Thorsten Ottosen), кроме других форм инициализации стандартных коллекций поддерживает также более сложную форму инициализации списком с запятыми. Эта библиотека доступна на сайте http://www.boost.org.

Об авторах

Д. Райан Стефенс (D. Ryan Stephens) — студент, живущий в г. Темп, шт. Аризона; он занимается разработкой программного обеспечения и является автором ряда работ по программированию. Ему нравится программировать практически на любом языке, особенно на С++. В его интересы входит поиск информации и ее извлечение из данных, а также все, что связано с алгоритмами и большими наборами данных. Когда он не работает, не пишет статьи и не программирует, он играет со своими детьми, работает по дому и катается на велосипеде.

Кристофер Диггинс (Christopher Diggins), который начал заниматься программированием в очень раннем возрасте (haut comme trois pommes), является независимым разработчиком программного обеспечения и автором, пишущим в этой области. Кристофер регулярно публикует свои статьи в журнале «C++ Users Journal» и является разработчиком языка программирования Heron.

Джонатан Турканис (Jonathan Turkanis) — автор библиотеки Boost Iostreams и нескольких других библиотек C++ с открытым исходным кодом, охватывающих такие области, как «умные» указатели, отражение состояния программы на этапе выполнения, программирование обобщенных компонент и программирование, ориентированное на характерные особенности (aspect-oriented programming). Он является аспирантом Калифорнийского университета г. Беркли по специальности «математическая логика».

Джефф Когсуэлл (Jeff Cogswell) занимается разработкой программного обеспечения и живет недалеко от Цинциннати, шт. Огайо. Он программирует на C++ почти со времени появления этого языка, и им написано много работ по нему, включая две другие книги по C++. Он также любит программировать на других языках, особенно на Python. Когда не работает (что случается редко), он любит читать хороший роман или играть на гитаре.

Колофон

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

На обложке «C++: рецепты программирования» представлена собака породы колли. Этот тип овчарки появился в гористой местности Шотландии и Британии в 1600-х годах. Одна разновидность овец в гористой Шотландии имела темные метки на морде и ногах, и поэтому таких овец называли «Colley»; это название происходит от старошотландского слова, обозначающего уголь. Современная порода колли светлее и более ширококостная, чем ее шотландские предки; она была выведена в конце 19-го столетия. В настоящее время колли, в основном, являются домашними любимцами, хотя в Соединенных Штатах они по-прежнему используются в фермерских хозяйствах.

Существует две разные породы колли: грубошерстные колли, которые использовались для охраны овец, и гладкошерстные - для сопровождения скота на рынок. Обе породы - это гибкие, стройные собаки с четко выраженной мордой и заостренными ушами. По высоте колли достигают 22-26 дюймов и весят 50-75 фунтов. Они обычно имеют белый мех с добавками другого цвета: от желто-белого и рыжего до угольно-черного.

К знаменитым колли относится, конечно, Лэсси, Бланко Линдона Джонсона и Лэдди из сериала «Симпсоны» (The Simpsons).

Мэтт Хатчинсон (Matt Hutchinson) был редактором по производству книги «С++: рецепты программирования». Издательство «Octal Publishing, Inc.» предоставляло производственные услуги. Дарен Келли (Darren Kelly), Адам Уитвер (Adam Witwer) и Клер Клутье (Claire Cloutier) обеспечивали контроль качества.

Карен Монтгомери (Karen Montgomery) разработала обложку этой книги на основе серии проектов Эдди Фридманом (Edie Freedman). Изображение на обложке взято из гравюры 19-го столетия, которая приводится в «Natural History» (Естественная история) издательского дома Cassell. Карен Монтгомери сделала макет обложки, используя InDesign CS компании Adobe и шрифт ITC Garamond той же компании.

Дэвид Футато (David Futato) разработал внутренний дизайн книги. Эта книга была переведена Кейт Фалгрен (Keith Fahlgren) в формат FrameMaker 5.5.6 с помощью утилиты преобразования форматов, которую создали Эрик Рей (Erik Ray), Джейсон Макинтош (Jason Mcintosh), Нейл Уэллс (Neil Walls) и Майк Сьерра (Mike Sierra); эта утилита использует язык Perl и XML-технологию. Для текста использован шрифт Linotype Birka, шрифт заголовков — Adobe Myriad Condensed, а шрифт программного кода — TheSans Mono Condensed компании «LucasFont». Иллюстрации, которые содержатся внутри книги, были сделаны Робертом Романо (Robert Romano), Джессамин Рид (Jessamyn Read) и Лесли Бораш (Lesley Borash) с помощью Macromedia FreeHand MX и Adobe Photoshop CS. Пиктограммы советов и предупреждений были нарисованы Кристофером Бингом (Christopher Bing). Заключение составил Мэтт Хатчинсон.

Примечания

1

Экспорт символов с помощью __declspec(dllexport) иногда неправильно называют неявным экспортом

2

В версиях Visual C++ до Visual C++ 2005 эта опция называлась Visual C++ Projects.

3

В версиях Visual C++ до Visual C++ 2005 эта опция называлась Visual C++ Projects.

4

В версиях Visual C++ до Visual C++ 2005 эта опция называлась Visual C++ Projects.

5

Почему почти? Потому что даже Comeau и Intel содержат несколько ошибок, а интерпретация некоторых частей стандарта вызывает разночтения

1 ... 132 133 134 135 136 ВПЕРЕД
Перейти на страницу:

Откройте для себя мир чтения на siteknig.com - месте, где каждая книга оживает прямо в браузере. Здесь вас уже ждёт произведение Д. Стефенс - C++. Сборник рецептов, относящееся к жанру Программирование. Никаких регистраций, никаких преград - только вы и история, доступная в полном формате. Наш литературный портал создан для тех, кто любит комфорт: хотите читать с телефона - пожалуйста; предпочитаете ноутбук - идеально! Все книги открываются моментально и представлены полностью, без сокращений и скрытых страниц. Каталог жанров поможет вам быстро найти что-то по настроению: увлекательный роман, динамичное фэнтези, глубокую классику или лёгкое чтение перед сном. Мы ежедневно расширяем библиотеку, добавляя новые произведения, чтобы вам всегда было что открыть "на потом". Сегодня на siteknig.com доступно более 200000 книг - и каждая готова стать вашей новой любимой. Просто выбирайте, открывайте и наслаждайтесь чтением там, где вам удобно.

Комментарии (0)