如何将'std :: chrono :: duration <int,std :: ratio <2629746l,=“”1l =“”>&gt;'转换为'int'类型?

时间:2016-10-17 11:01:46

标签: c++ date c++11 chrono static-cast

我正在使用Howard Hinnant's date library,并尝试查找两个日期之间的总月数。

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)但收到了同样的错误。

2 个答案:

答案 0 :(得分:4)

std::chrono::duration模板的实例不会(甚至明确地)转换为int。演员阵容无效。如果您查看this reference,就会发现没有转换运算符。

std::chrono::duration_cast的{​​{3}}你会发现

  

除非ToDuration是std :: chrono :: duration的实例,否则该函数不参与重载决策。

int不是std::chrono::duration的实例,因此您的第二次尝试将无效。

如果您再次查看std::chrono::duration的引用,您会找到count成员函数,

  

返回此持续时间的刻度数。

这就是你要找的东西。首先使用chrono::duration_cast将持续时间转换为表示时间的表单,该表单具有适当的刻度持续时间(在本例中为一个月),然后在该持续时间表示上调用count。如果您的持续时间已经在所需的表示中,则不需要持续时间演员步骤。

答案 1 :(得分:3)

以下是关于此主题的文章:

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

文章从更多问题开始:

  

我们是否需要&#34;完整月份的数量&#34;?或许我们应该四舍五入   最接近的整数月数?或者我们想要一个浮点   几个月可以显示分数月的代表?

鉴于两个year_month_day个对象d1d2,以下是截断为零的月份差异:

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

这会返回一个名为chrono的{​​{1}}个持续时间。

以上完全忽略了每个日期的日期字段。如果您想将日期字段考虑在内并向最近的方向前进:

months

还有一种方法可以解决文章中显示的浮点月数。

一旦你有任何精度的auto dp1 = sys_days(d1); auto dp2 = sys_days(d2); auto delta = round<months>(dp2-dp1); 持续时间,任何表示,都可以使用chrono .count()成员函数获得该表示的值:

chrono::duration