周期计数功能

Period count function

我是 chrono 库的新手,我正在尝试使用它来编写一个函数 returns 两次之间有多少个 5 分钟的周期。请注意:1 分钟的来源和 5 分钟的结果周期可能不同,因此解决方案需要灵活(例如 5 分钟的来源,15 分钟的结果周期是一种可能的组合)。

比如我有如下通用代码:

using namespace std::chrono;
using namespace std::chrono_literals;

auto tp_now = system_clock::now();  //define 1st tp
auto tp_test = tp_now - 4min;       //define 2nd tp

duration<int64_t, std::ratio<1, 5*60>> five_mins;   //define a duration of 5mins
std::cout << "period_index = " << floor(five_mins(tp_test)).count() << std::endl;  //print out the 
                                                                                   //period 
                                                                                   //duration count

此代码无法编译(我不确定为什么)但它希望显示在 4 分钟测试周期内有多少个 5 分钟周期。显然,4 分钟的测试时间是一个变量,可能会有所不同。下面给出了 4min 变量与相应结果不同的一些示例:

0-4 mins    result = 0
5-9 mins    result = 1
10-14 mins  result = 2
15-19 mins  result = 3
20-24 mins  result = 4

请问我该如何实现?

有什么你不想写的原因吗:

std::cout << (/*some duration*/ / minutes(5)) << std::end;

CppReference

例如minutes(14)/minutes(5)的值为2seconds(1000) / minutes(5)的值为3

five_mins 应该是 类型 ,而不是变量。

此外,std::ratio<1, 5*60> 表示 1 秒的百分之三,而不是 5 分钟。

using five_mins = duration<int64_t, std::ratio<5*60>>;

此外,由于可能发生截断并且时间不是浮点数,因此您不能使用 five_mins 构造函数。你必须使用 std::chrono::duration_cast<>,像这样:

#include <chrono>
#include <iostream>

int main() {
    using five_mins = std::chrono::duration<int64_t, std::ratio<5*60>>;
    std::cout << std::chrono::duration_cast<five_mins>(std::chrono::seconds(700)).count() << std::endl;
}

您可以在此处查看正式的详细信息:https://en.cppreference.com/w/cpp/chrono/duration/duration,在构造函数 #4 下。

最后,从你原来的问题来看,你仍然需要将你的时间点转换成持续时间才能得到一个完整的工作程序:

std::cout << "period_index = " << std::chrono::duration_cast<five_mins>(tp_test-tp_now).count() << std::endl