Подскажите, Может ли быть в C++ 14.11.17 следующее:
1) установить время, используя временные суффиксы
double time1 = 1s; // time1 = 1.0
double time2 = 2m; // time2 = 120.0
double time3 = 7ms; // time3 = 0.007
2) получить строковое значение времени с установленным суффиксом
std::cout << getTime(time1); // cout 1s
std::cout << getTime(time2); // cout 2s
std::cout << getTime(time3); // cout 7ms
1) Нет
2) Нет, не напрямую. Существуют операторы для преобразования в хронотипы (правда, для целых чисел, а не для двойников), но у них нет operator<<
перегрузок. boost::chrono
имеет красивые принтеры (хотя они устарели). Однако они выписываются полностью, а не только в краткой форме.
Видеть:
Хм, ясно, что ответ на первый вопрос "да". Я предлагаю вам удалить этот ответ, иначе вас довольно быстро проголосуют.
Нет, литералы создают хронотипы (как указано в пункте 2). Пример OP создает двойники.
... затем перепишите свой односложный ответ, чтобы объяснить, что вы имеете в виду.
Все современные утилиты времени C++ описаны в справочнике по библиотеке <chrono>.
Да, начиная с c++14 у нас есть std::literals::chrono_literals
,
что позволяет нам использовать следующие литералы:
operator""h
operator""min
operator""s
operator""ms
operator""us
operator""ns
Например (из cppreference):
#include <iostream>
#include <chrono>
int main()
{
using namespace std::chrono_literals;
auto day = 24h;
auto halfhour = 0.5h;
std::cout << "one day is " << day.count() << " hours\n"
<< "half an hour is " << halfhour.count() << " hours\n";
}
Не напрямую, но начиная с c++11 существует
std::chrono::duration,
с несколькими удобными типами помощников, которые помогут правильно описать время
(например, std::chrono::millisceonds
, std::chrono::hours
и т. д.). С использованием
те, вы можете легко сделать то, что нужно.
Сокращенный пример из cppreference. Как видите, модуль необходимо распечатать отдельно, но выбрав нужную единицу для печати было бы достаточно легко с помощью магии шаблонов.
#include <iostream>
#include <chrono>
int main()
{
std::chrono::seconds sec(1);
std::cout << sec.count() <<" second is equal to:\n";
// integer scale conversion with no precision loss: no cast
std::cout << std::chrono::microseconds(sec).count() << " microseconds\n";
// integer scale conversion with precision loss: requires a cast
std::cout << std::chrono::duration_cast<std::chrono::minutes>(sec).count()
<< " minutes\n";
}
да, через std::chrono_literals.
Не напрямую, но вы можете распечатать typeid
(используется для отладки) или предоставить перегрузки для длительности потоковой передачи самостоятельно.
Я включил здесь явные перегрузки operator<<
, но как @ДжеДжо, это также можно сделать с помощью шаблонов: https://wandbox.org/permlink/o495eXlv4rQ3z6yP
#include <iostream>
#include <chrono>
#include <typeinfo>
using namespace std::chrono_literals;
// example overloads for streaming out durations
std::ostream& operator<<(std::ostream& os, const std::chrono::nanoseconds& v) {
return os << v.count() << "ns";
}
std::ostream& operator<<(std::ostream& os, const std::chrono::microseconds& v) {
return os << v.count() << "us";
}
std::ostream& operator<<(std::ostream& os, const std::chrono::milliseconds& v) {
return os << v.count() << "ms";
}
std::ostream& operator<<(std::ostream& os, const std::chrono::seconds& v) {
return os << v.count() << "s";
}
std::ostream& operator<<(std::ostream& os, const std::chrono::minutes& v) {
return os << v.count() << "min";
}
std::ostream& operator<<(std::ostream& os, const std::chrono::hours& v) {
return os << v.count() << "h";
}
int main() {
auto time1 = 1s;
auto time2 = 2min;
auto time3 = 7ms;
std::cout << time1.count() << " " << typeid(time1).name() << "\n";
std::cout << time2.count() << " " << typeid(time2).name() << "\n";
std::cout << time3.count() << " " << typeid(time3).name() << "\n";
std::cout << time1 << "\n";
std::cout << time2 << "\n";
std::cout << time3 << "\n";
}
Возможный вывод:
1 NSt6chrono8durationIlSt5ratioILl1ELl1EEEE
2 NSt6chrono8durationIlSt5ratioILl60ELl1EEEE
7 NSt6chrono8durationIlSt5ratioILl1ELl1000EEEE
1s
2min
7ms
Да, начиная с C++14, вы можете использовать определяемые пользователем литералы описано здесь для создания длительностей:
#include <chrono>
using namespace std::literals;
auto time1 = 1s; // std::chrono::seconds{1}
auto time2 = 2min; // std::chrono::minutes{2}
auto time3 = 7ms; // std::chrono::milliseconds{7}
Они создают типобезопасные объекты, которые хранят целочисленное значение. Вы можете довольно легко использовать double
внутри, но эти специализации не поставляются с красивым псевдонимом типа из коробки:
namespace chr = std::chrono;
using dbl_seconds = chr::duration<double, chr::seconds::period>;
// Likewise for other units
dbl_seconds time1 = 1s;
Если вам абсолютно необходимо внутреннее значение (обычно это плохая идея), вы можете получить к нему доступ с помощью .count()
.
Планируется, что это появится в C++20:
std::cout << time1; // 1s, or 1.000000s if using double
До тех пор лучшее, что вы можете сделать со стандартным C++, — это смириться с ним и использовать count()
:
std::cout << time1.count() << 's'; // 1s
Чтобы лучше ознакомиться с библиотекой, посмотрите Выступление Ховарда на CppCon. Другие его доклады касаются запланированных дополнений C++20.
Это суффиксы, а не префиксы.