2016-10-17 28 views
3

我使用Howard Hinnant's date library,並試圖找到兩個日期之間的月總數量。如何轉換「的std ::計時::持續時間<整型,性病::比<2629746升,1升>>」到「INT」類型?

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)卻收到了同樣的錯誤。

回答

3

以下是關於這個主題的一篇文章:

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

文章從更多的問題:

難道我們想的 「全月」 是多少?或者,也許我們應該圍繞到 整數個月的最近數量?或者我們想要一個可以顯示小數月的浮點數 表示?

給定兩個year_month_day對象d1d2,這裏是向零截斷個月的區別:

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

這將返回一個chrono持續時間稱爲months

上面完全忽略每個日期的日子字段。如果你想利用一天領域考慮和全面走向最近的:

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

還有一種方式來獲得在文章中表示浮點個月的差別。

一旦你有一個chrono持續時間的任何精度,與任何表示,一個可以得到代表的價值用出來的chrono::duration.count()成員函數:

cout << delta.count() << '\n'; 
+0

而且,我們如何轉換'delta'爲int? – Shravan40

+0

@ Shravan40:用該詳細信息更新答案。 –

+1

@ Shravan40:如果有幫助,下面是一個關於chrono的視頻教程:https://www.youtube.com/watch?v=P32hvk8b13M很有用,因爲日期庫建立在計時器上。 –

4

std::chrono::duration模板的實例未被(甚至明確地)轉換爲int。演員陣容將無法工作。如果你看看this reference,你會發現沒有轉換操作符。

std::chrono::duration_castthis reference你會發現,

功能不參與重載決議,除非ToDuration是的std ::計時::持續時間的實例。

int不是std::chrono::duration一個實例,因此你的第二次嘗試將無法工作。


如果你再看看的std::chrono::duration參考,你會發現count成員函數,這

返回滴答數這個時間。

這是你在找什麼。首先使用chrono::duration_cast的持續時間轉換成表示時間與適當的持續時間蜱(在這種情況下一個月),然後調用該持續時間表示count的整數的形式。如果您的持續時間已在所需的表示形式中,則持續時間投射步驟是不必要的

相關問題