周期计数功能
我是 chrono 库的新手,我正在尝试使用它来编写一个函数,该函数返回两次之间有多少 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
我怎样才能做到这一点?
回答
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