【问题标题】:What are the alternatives for C++11 chrono?C++11 chrono 的替代品有哪些?
【发布时间】:2014-09-30 00:18:14
【问题描述】:

我正在运行下面的代码来检查data_timestamp 是否超过两周。如果超过两周,则打印hello,否则打印world

我是一名 Java 开发人员,最近开始使用 C++。在互联网上学到了一些东西,所以我在这个程序中使用它。我没有意识到并非所有代码都可以使用 C++11 功能运行。

#include <ctime>
#include <chrono>
#include <iostream>

int main()
{

    uint64_t data_timestamp = 1406066507000; 

    const auto now = std::chrono::system_clock::now();
    auto twoWeeks = std::chrono::hours(24 * 14);
    auto lastTwoWeeks = now - twoWeeks;

    auto millis = std::chrono::duration_cast<std::chrono::milliseconds>(lastTwoWeeks.time_since_epoch()).count();

    std::cout << "Time stamp in milliseconds since UNIX epoch start: "<< millis << std::endl;

    if (data_timestamp < millis) { 
        std::cout << "Hello"; 
    } else { 
        std::cout << "World"; 
    }

    return 0;
}

目前上述代码使用 C++11 功能,但我使用上述两周大时间戳的代码逻辑的实际代码不支持 C++11,因此我正在寻找各种替代方案。

我还可以在这里使用什么不需要 C++11 的可移植性?我可以在这里使用&lt;ctime&gt;Boost.Chrono 吗?

任何与上述代码执行相同操作但不使用 C++11 功能的简单示例都会有很大帮助。

更新:-

下面是我正在尝试的代码 -

#include <boost/chrono/chrono.hpp>
#include <iostream>

int main()
{
    uint64_t data_timestamp = 1406066507000; 

    const auto now = boost::chrono::system_clock::now();
    auto twoWeeks = boost::chrono::hours(24 * 14);
    auto lastTwoWeeks = now - twoWeeks;

    auto millis = boost::chrono::duration_cast<boost::chrono::milliseconds>(lastTwoWeeks.time_since_epoch()).count();

    std::cout << "Time stamp in milliseconds since UNIX epoch start: "<< millis << std::endl;

    if (data_timestamp < millis) { 
        std::cout << "Hello"; 
    } else { 
        std::cout << "World"; 
    }

    return 0;
}

当我使用make install -j4 编译代码时,下面是我回来的异常 -

warning: âautoâ changes meaning in C++11; please remove it [-Wc++0x-compat]
error: ânowâ does not name a type
warning: âautoâ changes meaning in C++11; please remove it [-Wc++0x-compat]
error: âtwoWeeksâ does not name a type
warning: âautoâ changes meaning in C++11; please remove it [-Wc++0x-compat]
error: âlastTwoWeeksâ does not name a type
warning: âautoâ changes meaning in C++11; please remove it [-Wc++0x-compat]
error: âmillisâ does not name a type
error: âmillisâ was not declared in this scope

【问题讨论】:

  • boost::chrono 肯定是一个很好的选择...
  • 当然你可以使用 boost.chrono,因为 C++11 chrono 是基于它的
  • ... 然后用具体的boost::chrono 数据类型替换auto 声明。
  • @user2809564:正如他们所说,将所有auto更改为显式类型,并将所有std::chrono::更改为boost::chrono::include &lt;boost/chrono.hpp&gt;
  • @user2809564 我警告过你auto ca。应用编辑前 30 分钟。你明白我们在说什么吗?!?

标签: c++ c++11 boost ctime


【解决方案1】:

我会建议 boost::chrono,因为 C++11 规范主要基于 boost::date_time(阅读诸如 this one 之类的提案会发现有多少提升被用作 std::chrono 的基础)。正如 Howard Hinnant 评论的那样,boost::chrono 是从 std::chrono 复制而来的

一旦您获得可用的 C++11 编译器(易于移植到 std::),它也会让您的工作变得更轻松


一个简单的例子:

#include <boost/chrono/chrono.hpp>
#include <iostream>

int main()
{
    uint64_t data_timestamp = 1406066507000;

    const boost::chrono::system_clock::time_point now = boost::chrono::system_clock::now();
    boost::chrono::hours twoWeeks = boost::chrono::hours(24 * 14);
    boost::chrono::system_clock::time_point lastTwoWeeks = now - twoWeeks;

    boost::int_least64_t millis = boost::chrono::duration_cast<boost::chrono::milliseconds>(lastTwoWeeks.time_since_epoch()).count();

    std::cout << "Time stamp in milliseconds since UNIX epoch start: "<< millis << std::endl;

    if (data_timestamp < millis) {
        std::cout << "Hello";
    } else {
        std::cout << "World";
    }

    return 0;
}

【讨论】:

  • 非常感谢您的建议。我没有意识到 c++11 chrono 与 boost::chrono 非常相似。此外,您在比较 uint64_t 和 auto 以进行时间戳比较时是否发现任何问题? data_timestamp 必须在 uint64_t 中,因为这是旧代码现在使用的。
  • 如果millis 可以为负数,是的,您会遇到问题。在进行比较之前,您可能需要检查一下。
  • 当然,感谢您的额外提示。我尝试编译代码,但不知何故它给了我编译异常。我已经用编译问题更新了这个问题。你能想到哪里出了问题吗?
  • auto 类型推导是 c++11 的特性,删除 auto 并改用显式类型(已编辑,但我没有尝试过)
  • 为了记录,std::chrono 是从 boost::date_time 演变而来的,boost::chrono 是从 std::chrono 复制而来的。 :-)
猜你喜欢
  • 2012-12-18
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 2023-01-13
  • 2011-02-19
相关资源
最近更新 更多