如何在C 11中找到持续时间(时间)单位
How to find duration (time) units in C++11
我想拥有一个PrintDuration
函数,该函数打印任务需要多长时间,并且允许用户指定打印的单元。示例用法:
auto start = std::chrono::system_clock::now();
std::this_thread::sleep_for(std::chrono::seconds(3));
PrintDuration<std::chrono::microseconds>(std::cout, start, "Waited for:");
它将打印出类似的内容: "Waited for: 3000000μsn"
我的问题是:如何找到用户提供的单元?
目前,我正在使用以下内容:
template <class T>
std::intmax_t GetNum(const T& duration)
{
return T::period::num;
}
template <class T>
std::intmax_t GetDen(const T& duration)
{
return T::period::den;
}
typedef std::chrono::time_point<std::chrono::system_clock> TimePoint_t;
template <class Duration = std::chrono::seconds>
void PrintDuration(std::ostream& output,
const TimePoint_t& start,
std::string message)
{
auto duration = std::chrono::system_clock::now() - start;
auto convertedDuration = std::chrono::duration_cast<Duration>(duration);
auto count = convertedDuration.count();
std::string units("");
if (GetNum(convertedDuration) == 1)
{
if (GetDen(convertedDuration) == std::nano::den)
units = "ns";
else if (GetDen(convertedDuration) == std::micro::den)
units = "u03BCs"; // us
else if (GetDen(convertedDuration) == std::milli::den)
units = "ms";
else if (GetDen(convertedDuration) == 1)
units = "s";
else
units = "";
}
else if(GetDen(convertedDuration) == 1)
{
if (GetNum(convertedDuration) == 60)
units = "m";
else if (GetNum(convertedDuration) == 3600)
units = "h";
else
units = "";
}
output << message << ' ' << count << units << '.' << std::endl;
}
虽然效果很好,但似乎很详细。我查看了C 的文档,但找不到。任何帮助都非常感谢。
您可以这样写:
template <typename T>
const wchar_t* GetUnits(T) { return L"unknown units"; }
template<>
const wchar_t* GetUnits(std::chrono::nanoseconds) { return L"ns"; }
template<>
const wchar_t* GetUnits(std::chrono::microseconds) { return L"u03BCs"; }
template<>
const wchar_t* GetUnits(std::chrono::milliseconds) { return L"ms"; }
typedef std::chrono::time_point<std::chrono::system_clock> TimePoint_t;
template <class Duration>
void PrintDuration(std::wostream& output, const TimePoint_t& start, const std::wstring& message)
{
auto duration = std::chrono::system_clock::now() - start;
auto convertedDuration = std::chrono::duration_cast<Duration>(duration);
output << message << L" " << convertedDuration.count() << GetUnits(convertedDuration) << L"." << std::endl;
}
int main(int /*argc*/, char* /*argv*/[])
{
auto start = std::chrono::system_clock::now();
std::this_thread::sleep_for(std::chrono::seconds(3));
PrintDuration<std::chrono::microseconds>(std::wcout, start, L"Waited for:");
return 0;
}
相关文章:
- 从持续时间构造std::chrono::system_clock::time_point
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 时间持续时间到时间字符串
- 指向(数据)成员的指针作为非类型模板参数,例如具有自动存储持续时间/无链接
- ExtTextOut 文本的持续闪烁,在一段时间后,文本将恢复为默认字体
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- 将毫秒转换为给定格式的持续时间
- 具有静态存储持续时间的常量初始化变量的初始化顺序
- 划分和乘以STD :: Chrono ::持续时间
- 静态存储持续时间初始化
- C++计划持续时间内(字体)资源的分配
- FFMPEG:具有不同持续时间的多路复用流
- 在不同翻译单元中具有静态存储持续时间的依赖非局部常量浮点变量的常量初始化
- 使用System_Clock :: TO_TIME_T警告持续时间_t
- 访问和存储/解析性std :: Chrono ::持续时间:: milliseconds(cpprest)时使用什么类型
- 我可以让QT到概要文件插槽执行持续时间吗?
- 持续的时间访问是否在某个时候意味着连续内存
- 升压C 的时期时间/时间格式
- 如何在C 11中找到持续时间(时间)单位
- 如何解析带有日期-时间+时间偏移的字符串到boost::posix_time::ptime