如何将"std::chrono::d uration<int, std::ratio<2629746l, 1l> >"转换为"int"类型?

How to convert ‘std::chrono::duration<int, std::ratio<2629746l, 1l> >’ to ‘int’ type?

本文关键字:gt int lt std 转换 类型 1l ratio chrono uration 2629746l      更新时间:2023-10-16

我正在使用Howard Hinnant的日期库,并试图找到两个日期之间的总月数。

invalid static_cast from type ‘std::chrono::duration<int, std::ratio<2629746l, 1l> >’ to type ‘int’
  int period = static_cast<int>(period_in_months(start_date, end_date));

下面是我使用的函数:

auto period_in_months(year_month_day start_date, year_month_day end_time) {
   auto total_months = ((end_time.year() - start_date.year())*12 + (end_time.month() - start_date.month()));
   return (total_months--);
}
double percentage_return(string risk_profile, year_month_day start_date, year_month_day end_date) {
   int period = static_cast<int>(period_in_months(start_date, end_date));
   // do something 
}

我尝试使用chrono::duration_cast<int>(period_in_months(start_date, end_date),但收到相同的错误。

这里有一篇关于这个主题的文章:

https://github.com/HowardHinnant/date/wiki/Examples-and-Recipes deltamonths

文章以更多问题开头:

我们想要"完整月"的数量吗?或许我们应该凑近到最接近整数月份的数是多少?还是需要一个浮点数可以显示小数月份的月份表示?

给定两个year_month_day对象d1d2,以下是截断为零的月差:

(d2.year()/d2.month() - d1.year()/d1.month())

返回chrono的持续时间称为months

上面的代码完全忽略了每个日期的day字段。如果您想要考虑日期字段并向最接近的方向舍入:

auto dp1 = sys_days(d1);
auto dp2 = sys_days(d2);
auto delta = round<months>(dp2-dp1);

还有一种方法可以获得本文中显示的浮点月份的差异。

一旦你有了任意精度、任意表示的chrono持续时间,你就可以用chrono::duration.count()成员函数得到该表示的值:

cout << delta.count() << 'n';

std::chrono::duration模板的实例不能(甚至显式地)转换为int。石膏不起作用。如果你看一下这个引用,你会发现没有转换操作符。

std::chrono::duration_cast的参考中你会发现

函数不参与重载解析,除非ToDuration是std::chrono::duration的实例。

int不是std::chrono::duration的实例,所以你的第二次尝试不会成功。


如果你再看一下std::chrono::duration的引用,你会发现count成员函数,

返回此持续时间的滴答数。

这就是你要找的。首先使用chrono::duration_cast将持续时间转换为一种形式,该形式将时间表示为带有适当的刻度持续时间(在本例中为一个月)的整数,然后对该持续时间表示调用count。如果您的持续时间已经是所需的表示形式,则无需执行持续时间转换步骤。