2016-04-25 75 views
0

我使用外部函數庫中的函數,其接口如下所示:void f(int timeout);。 其中timeout以毫秒爲單位。爲了使我的代碼更具可讀性,我想在這樣的形式使用chronoC++ 11使用chrono作爲語法糖

f(std::chrono::milliseconds(10).count()); 
  1. 是有可能,std::chrono::milliseconds(10).count() != 10

  2. 是什麼防止現代編譯器(clang,gcc,VC++)將f(std::chrono::milliseconds(10).count())轉換爲f(10)的「水下岩石」?

+0

單獨計算持續時間是沒有意義的,只有在您將其與另一個持續時間進行比較時纔有意義。 –

+0

你也應該考慮使用'運算符'「ms'。而不是寫'std :: chrono :: milliseconds(10)'只寫'10ms'。 – UniversE

+1

semantic sugar lol – erip

回答

2
  1. 是有可能,std::chrono::milliseconds(10).count() != 10

號的duration constructor您正在使用的功能:

3)構造r蜱的持續時間。

count()簡單:

返回蜱此期間的數量。


  • 是任何 「水下岩石」 防止現代編譯器(鐺,GCC,VC++)轉換f(std::chrono::milliseconds(10).count())f(10)
  • 沒有。 duration的構造函數是constexpr,因爲你正在使用的count()成員函數 - 這對於編譯器來說應該是一個非常簡單的優化。


    爲了讓我的代碼更易讀[...]

    就個人而言,我覺得值得商榷。如果f()本身花費了 a duration,那麼f(std::chrono::milliseconds(10))本身肯定比f(10)更好,並帶來額外的好處,無論您通過什麼持續時間都能正常工作。但是,如果只是採取了int,那麼您只需給自己更多打字的安全感。所以我個人不確定它會更好。

    +0

    所以你認爲,當你在代碼中看到'f(10)',並且你需要打開文檔來找出哪個單元'f'接受超時時,那麼最好是'f(std :: chrono ::毫秒(10).count())'哪個文件本身? – user1244932

    +1

    @ user1244932如果'f'在幾秒鐘內超時?無論哪種方式,它不再是自我記錄,然後f(10); //毫秒「或等效。 – Barry

    1
    1. 不可以,但要注意的是,結果不是毫秒,但是蜱。所以std::chrono::seconds(10).count()也是10.所以你可能想首先做一個std::chrono::milliseconds變量的賦值。

    2. 不,因爲方法是constexpr。所以任何好的編譯器都應該尊重它。