2014-01-23 131 views
7

鑑於std::chrono::duration可以表示兩次之間的符號差異,因此需要此類持續時間的絕對值似乎是一種非常常見的情況。例如,下面的代碼輸出diff: -5預期:std :: chrono :: duration對象的絕對值

using namespace std; 
using namespace std::chrono; 

auto now = system_clock::now(); 
auto then = now - seconds(5); 
auto diff = then - now; 

cout << "diff: " << duration_cast<seconds>(diff).count() << endl; 

這將是很好能夠做這樣的事情:

auto diff = abs(then - now); 

不過,我看不到對的std::abs任何專業標準中的chrono模板,也不能在std::chrono::duration中看到任何適當的成員函數。

我應該如何將std::chrono::duration轉換爲絕對值?

+0

我很好奇。它會在什麼情況下有用? – user2079303

+0

不完美但是:'auto diff = then Borgleader

+0

@ user2079303在任何情況下,您需要知道兩個時間點('time_point')之間的經過時間('持續時間'),但不關心哪一個先發生。 – marack

回答

13

我會做這樣的:

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實用程序都是一個很好的教訓。

的東西我不喜歡它:

  1. 它不必要通過直接操作Rep下降類型的安全性。

  2. 它假定文字0可以隱式轉換爲或至少與Rep相媲美。

  3. 這沒有理由不是constexpr

  4. 對於未簽名的Rep的行爲,我不滿意。如果有人說:

    auto d = abs(t1 - t0);

t1t0基於無符號的持續時間,那麼這是可能在代碼中的邏輯錯誤。如果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; 
} 
  1. duration有一元-,只是使用它。

  2. duration有一個可定製zero特質只是讓人們不必從Rep承擔與0親密的合作關係。只要使用它。

  3. 所使用的所有操作是constexpr,標記爲absconstexpr

  4. 靜態函數minzeroconstexpr。使用這些來確定Rep是否有符號比使用諸如!std::is_unsigned的特徵更普遍。即Rep可能是BigNum或C11 timespec(用重載算術運算符增加)。所以「已簽名」的問題用min() < zero()回答。而現在這個版本的abs不會接受duration<unsigned, milli>(例如)。

+1

'std :: chrono :: abs'將在C++ 17中。 – Bulletmagnet

+0

不客氣:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0092r1.html ;-) –

相關問題