Если не оценивать преимущества и недостатки этого древнего метода обнаружения ошибок, то можно получить полезную дополнительную информацию о том, когда было сгенерировано исключение для таких системных функций, как файловые потоки. Исключения говорят нам,
errno
может подсказать, Глава 8
Вспомогательные классы
В этой главе:
□ преобразование единиц измерения времени с помощью std::ratio
□ преобразование между абсолютными и относительными единицами измерения времени с использованием std::chrono
□ безопасное извещение о сбое с помощью std::optional
□ применение функций для кортежей;
□ быстрое создание структур данных с помощью std::tuple
□ замена void*
std::any
для повышения безопасности типов;□ хранение разных типов с применением std::variant
□ автоматическое управление ресурсами с помощью std::unique_ptr
□ автоматическое управление разделяемой памятью кучи с использованием std::shared_ptr
□ работа со слабыми указателями на разделяемые объекты;
□ упрощение управления ресурсами устаревших API с применением умных указателей;
□ открытие доступа к разным переменным — членам одного объекта;
□ генерация случайных чисел и выбор правильного генератора случайных чисел;
□ генерация случайных чисел и создание конкретных распределений с помощью STL.
Введение
Эта глава посвящена вспомогательным классам, которые очень удобны для решения конкретных задач. Некоторые из них хороши настолько, что мы, вероятно, либо будем их очень часто встречать в любом фрагменте кода С++, либо уже видели в других главах книги.
Первые два примера посвящены измерению
В следующих пяти примерах мы рассмотрим типы optional
variant
и any
(они появились в C++14 и C++17), а также некоторые способы использования кортежей. Начиная с C++11, у нас появились сложные типы умных указателей, а именно unique_ptr
, shared_ptr
и weak_ptr
, которые очень эффективны при Наконец, мы кратко рассмотрим те части библиотеки STL, которые связаны с генерацией
Преобразуем единицы измерения времени с помощью std::ratio
Начиная с С++11 STL включает новые типы и функции для получения, измерения и отображения времени. Эта часть библиотеки существует в пространстве имен std::chrono
В этом примере мы сконцентрируемся на измерении промежутков времени и преобразовании результатов между единицами измерения времени, такими как секунды, миллисекунды и микросекунды. STL поддерживает функции, которые позволяют определять собственные единицы измерения времени и выполнять преобразования между ними.
Как это делается
В данном примере мы напишем небольшую игру, приглашающую пользователя ввести конкретное слово. Время, за которое он введет его с клавиатуры, будет измерено и выведено в нескольких единицах измерения.
1. Сначала включим все необходимые заголовочные файлы. Для удобства также объявим об использовании пространства имен std
#include
#include
#include
#include
#include
#include
using namespace std;
2. Тип chrono::duration
double
. В следующем больше сконцентрируемся на существующих определениях единиц времени, уже встроенных в STL.using seconds = chrono::duration
3. Миллисекунда — доля секунды, поэтому определяем эту единицу измерения в виде секунд. Параметр шаблона ratio_multiply
milli
к seconds::period
, что дает нужную долю секунды. Шаблон ratio_multiply
, по сути, представляет собой функцию метапрограммирования для умножения чисел на эти множители:using milliseconds = chrono::duration<
double, ratio_multiply
4. То же верно и для микросекунд. Миллисекунда — миллидоля секунды, а микросекунда — микродоля секунды:
using microseconds = chrono::duration<
double, ratio_multiply