2013-07-18 71 views
16

假設我們有std :: chrono :: duration缺少即時tick計數操作的原因是什麼?

#include <chrono> 
#include <iostream> 
#include <ctime> 

namespace Ratios { typedef std::ratio<60*60*24,1> Days; } 

typedef std::chrono::system_clock Clock; 
typedef Clock::time_point TimePoint; 

而且我們main看起來像

int main(int argc, char *argv[]) 
{ 
    // argc check left out for brevity 
    const Clock::rep d = static_cast<Clock::rep>(std::atoi(argv[1])); 
    // Right now 
    TimePoint now = Clock::now(); 
    // Start with zero days 
    auto days = std::chrono::duration<Clock::rep, Ratios::Days>::zero(); 

    // Now we'd like to add d to the days 
    days += d; // Error! 
    days.count() = d; // Error! 
    days = days + d; // Error! 
    days += std::chrono::duration<Clock::rep, Ratios::Days>(d); // Okay 
    days = days + std::chrono::duration<Clock::rep, Ratios::Days>(d); // Okay 

    days *= d; // Why is this okay? 
    days %= d; // And this too? 

    TimePoint later = now + days; 

    return 0; 
} 

什麼是落後禁止用戶直接操縱duration的原因嗎?

+0

所以很多很好的答案......我只能接受一個:) – rwols

回答

23

它是爲了強制你堅持強類型值而不是任意值。

Bjarne的Stroustrup的具有關於在 「The C++程序設計語言」 這一行爲的實例(第4版,35.2.1,第1011。):


週期是一個單元系統中,所以沒有或=服用+=一個普通值允許這將是象允許添加的一個未知的SI單位的5在米的長度考慮:。

duration<long long, milli> d1{7}; // 7 milliseconds 
d1 += 5; // error 
[...] 

這裏5是什麼意思? 5秒? 5毫秒? [...]如果你知道你的意思,明確表示它。例如:

d1 += duration<long long, milli>{5}; //OK: milliseconds" 

1

我會認爲這樣做是爲了強制你考慮你想要增加/減少的持續時間單位是多少。它也使你不能假設什麼時鐘刻度單位。

13

的基本原理是保持時間的單元,其duration表示的完整性。

您可以將rep視爲無單位。但duration有一個時間單位。人們可以加/減秒秒/秒。但是,如果不使表達式模糊,並且違反單位代數,就不能增加秒和單位數量。

也就是說,一個可以乘以一個標量(單位少)的時間單位,結果仍然是一個時間單位。這個庫僅代表第一個功率或零功率的時間單位。提高到零功率的時間單位是標量,由rep表示。時間單位也可以擁有2個或更多的權力,以及負面的權力。但是這個庫不代表這樣的單位。

添加兩個數量時,單位必須相同。

當乘以或除以兩個量時,形成新單位(例如km/hr)。當相同單位的數量相乘時,它們的指數相加(例如sec * sec == sec^2)。當相同單位的數量被分開時,它們的指數被減去(例如sec/sec == sec^0 ==標量)。

std::chrono::duration庫是一個物理量庫,處理和時間只單元和只有那些具有指數等於0的時間單位1.

+0

當談到處理零時,單位的美麗治療會失敗,因爲零與單位無關。當然這個限制來自零文字,它們沒有C++自己的類型 - 如果不接受任意標量就很難接受零。 (它肯定能說'if(d <0)',其中'd'有一定的持續時間。) –

8
days += d; // Error! 

這是因爲可變days是一致的子集單位爲86,400秒,變量d無單位。在標準尺寸分析中沒有定義將一個單位數量添加到無單位標量的結果。

days *= d; // Why is this okay? 
days %= d; // And this too? 

因爲乘以無量綱標量的數量並沒有意義。 2秒乘以2秒,結果爲4秒。

考慮將2秒乘以3秒;結果是單位'秒平方'的數量6。當然chrono::duration不是一個完整的單位庫,所以你不能像時間平方那樣的單位,但像boost.units這樣的庫將支持。

相關問題