5. Теперь реализуем функцию, которая считает входную строку, отправленную пользователем, и определит, сколько времени ему потребовалось для ее ввода. Она не принимает никаких аргументов и возвращает строку, введенную пользователем, а также время, которое ему потребовалось на ввод, упакованные в одну пару:
static pair
{
string s;
6. Нужно получить время, в которое пользователь начал вводить строку, а также время, в которое он это делать закончил. Данная операция выглядит следующим образом:
const auto tic (chrono::steady_clock::now());
7. Сейчас мы получим данные от пользователя. Если эта операция пройдет безуспешно, то просто вернем кортеж, инициализированный значениями по умолчанию. Вызывающая сторона получит пустую строку:
if (!(cin >> s)) {
return {{}, {}};
}
8. В случае успеха продолжим работу, сделав еще один снимок текущего времени. Далее вернем входную строку и разницу между временными точками. Обратите внимание: обе временные точки выражены в абсолютном виде, но, вычислив их разность, мы получаем длительность:
const auto toc (chrono::steady_clock::now());
return {s, toc - tic};
}
9. Теперь реализуем саму программу. Запустим цикл, который будет работать до тех пор, пока пользователь не введет корректную строку. На каждом шаге цикла мы просим пользователя ввести строку "C++17"
get_input
:int main()
{
while (true) {
cout << "Please type the word \"C++17\" as"
" fast as you can.\n> ";
const auto [user_input, diff] = get_input();
10. Далее проверим входные данные. Если они пусты, то интерпретируем это как запрос на завершение программы:
if (user_input == "") { break; }
11. Если пользователь корректно введет строку "C++17"
diff.count()
возвращает количество секунд в качестве числа с плавающей точкой. Используй мы оригинальный тип duration STL seconds
, получили бы milliseconds
или microseconds
нашу переменную diff
перед вызовом count()
, получаем то же значение, преобразованное в другую единицу измерения: if (user_input == "C++17") {
cout << "Bravo. You did it in:\n"
<< fixed << setprecision(2)
<< setw(12) << diff.count()
<< " seconds.\n"
<< setw(12) << milliseconds(diff).count()
<< " milliseconds.\n"
<< setw(12) << microseconds(diff).count()
<< " microseconds.\n";
break;
12. Если пользователь сделал опечатку, то позволим ему повторить попытку:
} else {
cout << "Sorry, your input does not match."
" You may try again.\n";
}
}
}
13. Компиляция и запуск программы дадут следующий результат. Сначала при наличии опечаток программа попросит пользователя ввести корректное слово. После этого она отобразит время, которое потребовалось на то, чтобы ввести его, в трех единицах измерения.
$ ./ratio_conversion
Please type the word "C++17" as fast as you can.
> c+17
Sorry, your input does not match. You may try again.
Please type the word "C++17" as fast as you can.
> C++17
Bravo. You did it in:
1.48 seconds.
1480.10 milliseconds.
1480099.00 microseconds.
Как это работает
Несмотря на то что этот раздел посвящен выполнению преобразований между разными единицами измерения времени, сначала нужно выбрать один из трех доступных объектов часов. Как правило, в пространстве имен std::chrono
между system_clock
, steady_clock
и high_resolution_clock
. Чем они отличаются? Взглянем на их описание (табл. 8.1).