std::chrono and cout

50

我有一个比较愚蠢的问题。我尝试切换到C++11头文件之一:chrono。但是我的问题是我无法打印时间运算结果,例如:

auto t=std::chrono::high_resolution_clock::now();
cout<<t.time_since_epoch();

给出:

初始化第1个参数:std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [使用_CharT = char,_Traits = std::char_traits<char>,_Tp = std::chrono::duration<long int,std::ratio<1l,1000000l> >]的... /usr/include/c++/4.6/ostream

说明:这是一个关于C++编程语言中的一条错误信息,可能和标准库文件有关,具体原因需要进一步调试分析。
cout<<(uint64_t)t.time_since_epoch();

出现无效强制转换

4个回答

52
正如其他人所指出的,您可以调用count()成员函数来获取内部计数。
我想补充一下,我正在尝试向这个库添加一个新的头文件:<chrono_io>。它在这里有文档说明。 <chrono_io>相对于仅使用count()的主要优点是,编译时单位会为您打印出来。当然,这些信息也可以手动获取,但让库自动完成会更容易。
对我来说,您的示例:
#include <iostream>
#include <chrono_io>

int main()
{
    auto t = std::chrono::high_resolution_clock::now();
    std::cout << t.time_since_epoch() << '\n';
}

输出:

147901305796958 nanoseconds

这个操作的源代码是开源的,可以在上面的链接中找到。它由两个头文件组成:<ratio_io><chrono_io>,以及一个源文件:chrono_io.cpp
请注意,此代码应被视为实验性的。它不是标准的,几乎肯定不会像现在这样被标准化。事实上,LWG的初步评论表明,他们更喜欢默认输出是该软件所称的“短格式”。可以使用以下命令获得此替代输出:
std::cout << std::chrono::duration_fmt(std::chrono::symbol)
          << t.time_since_epoch() << '\n';

并输出:

147901305796958 ns

更新

经过十年的努力,C++20现在具备以下功能:

#include <chrono>
#include <iostream>

int main()
{
    auto t = std::chrono::high_resolution_clock::now();
    std::cout << t.time_since_epoch() << '\n';
}

输出:

147901305796958ns

1
目前全球只有很少的时间专家,所以你做得很好! :-) 我可能误解了你的建议,但听起来你是建议为打印目的设置持续时间单位。这可能会导致不精确的转换悄然发生,而chrono的设计已经费尽心思防止这种情况发生。也就是说,只有在没有截断误差的情况下,不同的持续时间类型才会隐式转换。 - Howard Hinnant
1
我明白了,谢谢。在C++中,使用stream << object打印东西是传统的做法(这也是你尝试的第一件事)。最好坚持传统,以免混淆所有人(除非你想设计一个全新的I/O系统)。至于单独的头文件,我可以考虑将所有功能放入<chrono>中。这是一种工程权衡(会增加许多用例的编译时间)。标准化进度:我们非常幸运能在C++11中看到<chrono>。我们几乎得到了C12的xtime。标准化比设计要困难得多。 - Howard Hinnant
1
很遗憾,在搜索有关chrono i/o提案的时候,除了这个答案以外什么都没有出现。我们确实需要这样的增加。另外,我修复了你的链接,因为它们已经失效了。 - AliciaBytes
初步提案,包括持续时间格式:https://howardhinnant.github.io/date/d0355r1.html - Howard Hinnant
1
打印持续时间现在已经包含在C++20草案规范中,尽管确切的语法和格式与我的答案所示有所不同。 - Howard Hinnant
显示剩余6条评论

25

1
我使用过那个维基,但从未找到过...谢谢。 - NoSenseEtAl
2
请注意,链接示例与此处不同,它打印了两个now()调用之间的差异,并且不涉及time_since_epoch()。实际上,time_since_epoch未指定实际纪元(它取决于您获取时间点的时钟)。因此,简而言之,您正在打印的持续时间在没有有关纪元的附加信息的情况下有点毫无意义。 - Johan Boulé

13

如果你想在毫秒级别上获得定时,这就是你可以做的:

auto t1 = std::chrono::high_resolution_clock::now();
//process to be timed
auto t2 = std::chrono::high_resolution_clock::now();
std::cout << "process took: "
    << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count()
    << " milliseconds\n";

别忘了在包含的头文件中添加:

#include <chrono> //timing

7

不确定您从此代码中期望得到什么结果,也许您需要使用t.time_since_epoch().count()?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接