我會做這樣的:
template <class Rep, class Period>
std::chrono::duration<Rep, Period>
abs(std::chrono::duration<Rep, Period> d)
{
Rep x = d.count();
return std::chrono::duration<Rep, Period>(x >= 0 ? x : -x);
}
見我的<chrono>
Utilities列表其他<chrono>
公用事業我想是標準。請隨意使用它們,將它們推薦給您的標準機構代表,或者自己提出。
更新
我把我的比賽時,我寫上面。我並沒有刪除它,因爲它對於我自己和其他人如何不是寫入chrono
實用程序都是一個很好的教訓。
的東西我不喜歡它:
它不必要通過直接操作Rep
下降類型的安全性。
它假定文字0可以隱式轉換爲或至少與Rep
相媲美。
這沒有理由不是constexpr
。
對於未簽名的Rep
的行爲,我不滿意。如果有人說:
auto d = abs(t1 - t0);
和t1
和t0
基於無符號的持續時間,那麼這是可能在代碼中的邏輯錯誤。如果t1 < t0
,那麼你可能會得到一個不正確的,非常大的持續時間。如果這是你真正想要的,那麼你不應該使用abs
,而是剛剛編寫的簡單:
auto d = t1 - t0;
爲了解決這些問題我已經重寫abs
的持續時間爲:
template <class Rep, class Period,
class = typename std::enable_if
<
std::chrono::duration<Rep, Period>::min() <
std::chrono::duration<Rep, Period>::zero()
>::type
>
constexpr
inline
std::chrono::duration<Rep, Period>
abs(std::chrono::duration<Rep, Period> d)
{
return d >= d.zero() ? d : -d;
}
duration
有一元-
,只是使用它。
duration
有一個可定製zero
特質只是讓人們不必從Rep
承擔與0
親密的合作關係。只要使用它。
所使用的所有操作是constexpr
,標記爲abs
和constexpr
。
靜態函數min
和zero
是constexpr
。使用這些來確定Rep
是否有符號比使用諸如!std::is_unsigned
的特徵更普遍。即Rep
可能是BigNum
或C11 timespec
(用重載算術運算符增加)。所以「已簽名」的問題用min() < zero()
回答。而現在這個版本的abs
不會接受duration<unsigned, milli>
(例如)。
我很好奇。它會在什麼情況下有用? – user2079303
不完美但是:'auto diff = then
Borgleader
@ user2079303在任何情況下,您需要知道兩個時間點('time_point')之間的經過時間('持續時間'),但不關心哪一個先發生。 – marack