2017-05-31 4 views
5

duration_castを使用したコードを見ていました。それを見て、なぜstatic_castが使われなかったのかと疑問に思ったのは、static_castの人生の目的はタイプ間の変換だからです。なぜC++はstatic_castを使用する代わりにduration_castを導入しましたか?

なぜC++は時間の間に変換するために新しい演算子を必要としましたか? static_castはなぜ使われなかったのですか?


は、たぶん私はC++が何らかの理由でミリ秒、マイクロ秒、ナノ秒などの間で行っているの違いを理解していないん、私は、答えは明白またはスタックオーバーフローに議論されるだろうと思いましたしかし、私はそれを見つけていない(まだ)。

+1

duration_castは、異なる測定の2つの期間の間に変換する数学的計算を実行します。 static_castは、関連する階層のクラス間でのみ実行できます。 duration_castは、まったく関係のない2つのクラス間で変換されます。 –

+3

主な違いは、static_castはコンパイラに組み込まれていますが、duration_castは標準ライブラリのテンプレートです。 – dasblinkenlight

+0

ありがとう@dasblinkenlight。 'duration_cast'は演算子ではありませんでした(恐ろしいC++エンジニアリング)。この質問を削除する必要がありますか? – jww

答えて

4

精度の損失の恐れがない場合、すでに時間間隔の直接変換があります。 duration_castは、精度の低下のリスクがある場合に必要です。

duration_castは故意の変換ではありません。

static_castは、異なる継続時間タイプが関係しないため適切ではありません。それらはまったく異なるクラスで、同じ概念をサポートしています。

例えば:

#include <chrono> 

int main() 
{ 
    using namespace std::literals; 

    // milliseconds  
    auto a = 10ms; 

    // this requires a duration-cast 
    auto lossy = std::chrono::duration_cast<std::chrono::seconds>(a); 

    // but this does not 
    auto not_lossy = std::chrono::nanoseconds(a); 
} 
+0

ありがとう@リチャード。私の混乱の一部(大部分)は、それが命名された方法のために組み込み演算子であると信じていました。実際に、私はそれを質問の演算子と呼び、dasblinkenlightがそれを取り上げました。オペレーターではないことについて何かを加えると、私は受け入れることができるはずです。 – jww

+0

@jww私はちょうどコメントを読んだ。命名することに心から感謝しますが、 'dynamic_pointer_cast'、' static_pointer_cast'なども考慮してください。非言語レベルのキャストのこのコンセプトには、以前の形式があります。 –

+0

ありがとう@リチャード。 C++は 'static_cast'のように' X_cast'を演算子として使用します。 C++ 11は 'to_X'の傾向を始めました(' to_string'のように)。 'to_duration'を使うのはあまり混乱していなかったようです。 – jww

1

私は長年にわたって多くのことを質問している再訪している、と私は今、それは私の一部に設計ミスだったかもしれないと思います。

私は現在、「名前付き変換構文」ではなく、暗黙的に変換すべきでない変換の明示的変換構文にもっと依存して実験しています。例えば

https://howardhinnant.github.io/date/date.html#year

year y = 2017_y; 
int iy = int{y}; // instead of iy = y.to_int() 
+0

Web上のどこかでプロ/コンセプトが実現していますか? – bolov

+0

私はそれらをここに書きましたが、このテーマに特化した論文はありません。私が見る利点は、一様な変換構文です。これによりジェネリックコードを書くのが簡単になるだけでなく、 'to_int'や' as_int'や 'get'などのスペルを覚える必要がなくなり、新しいAPIを学ぶのが容易になります。暗黙の変換と明示的な変換だけがあります: 'T t = u;'と 'auto t = T {u};'。 –

関連する問題