2014-03-12 75 views
10

我想要一個函數來接受持續時間,以任何單位對調用者有意義。接受std :: chrono ::任何表示/期間的持續時間

例如:

transition->after(chrono::seconds(3)); 
transition->after(chrono::milliseconds(500)); 
transition->after(chrono::hours(1)); 

將這個after功能的有效簽名是什麼樣的?我可以避免使它成爲模板功能嗎?

+0

我會說只是接受無論你在內部使用,並讓'duration'做轉換。 –

回答

19

有幾個常見選項

1)使用模板。這具有沒有轉換的優點,但需要使用模板,這可能是不可能的。例如,如果這是虛擬功能的接口。

template<typename Rep, typename Period> 
void after(std::chrono::duration< Rep, Period > t); 

2)使用整數表示形式,以及界面所需的最低週期。例如,如果您的功能實際上只需要納秒,那麼您可以直接使用它。如果不會發生精度損失,這將隱式轉換爲納秒。您可以使用預先定義的,或明確將其指定爲持續時間

void after(std::chrono::nanoseconds t) ; 

3)使用雙表示,如果精度不是問題,這可能是有用的部分指定其他時間段,但接受所有投入的能力是。這將隱式轉換任何持續時間,因爲所有時間段都允許轉換爲浮點類型。例如,如果你想要雙精度秒,你會做

void after(std::chrono::duration<double> t); 
+0

非常感謝您的出色答覆。你的第二個建議對我很好。毫無疑問,其他人也將從這種選擇中受益,並找到滿足其需求的最佳方法。 –

相關問題