2012-09-07 6 views
23

私は、コンパイル時の有理数計算を可能にするC++ 11標準からクラスstd::ratio<>を見ていました。標準の背後にある設計原則::>

テンプレートデザインとクラスで実装された操作が過度に複雑で、本当に単純な有理クラスを実装し、演算子の関数を定義することによって、より簡単で直感的なアプローチを使用できないという理由が見つかりませんでした。その結果、クラスを使いやすくなり、コンパイル時のメリットが残りました。

誰でも現在のstd::ratio<>デザインの利点を、constexprを使用した単純なクラスの実装と比較して知っていますか?実際には、私は現在の実装に利点を見つけることができません。

+4

http://www.joelonsoftware.com/articles/fog0000000018.html –

+0

コンパイル時(したがってテンプレート)とランタイムとは異なりますか? – Drakosha

+4

@Drakosha: 'constexpr'はヒントではありません。特定のコンテキスト(定数式が必要な場合)では、コンパイラはコンパイル時にそれらを実行する必要があります。 –

答えて

36

N2661が提案されたとき、どの提案作成者もconstexprを実装したコンパイラにアクセスできませんでした。そして私たちの誰も、私たちが構築しテストできなかったものを提案しようとしていませんでした。だから、より良いデザインがconstexprで行われたかどうかは、設計上の考慮事項の一部でさえありませんでした。この設計は、当時の著者が利用可能なツールのみに基づいていました。

+0

もちろん、このような実用的な答えが出てくるでしょう。 : - – ildjarn

+4

@ jon34yp:興味深いことに質問者は2つの質問をしました。(1)Howardは権威であると主張する 'std :: ratio'の背後にある設計原則は何ですか? (2)Howardが認識していないあらゆる種類の答えを持つことができる、現在のデザインの利点は何ですか: –

0

std::ratioとその周囲のメカニズムは、テンプレートメタプログラミングとタイプ操作のおかげで常にコンパイル時に実行されます。 constexprは、C++の機能(テンプレートパラメータやconstexpr変数の初期化など)によって定数式が必要な場合にのみ実行時に実行する必要があります。

あなたにとってもっと重要なのは、コンパイル時の実行か、「より簡単で直感的な」ことですか?

+3

'constexpr'を使うと、定数式の直感的な使い方とコンパイル時の実行ができるので、テンプレートとまったく同じです。したがって、両方の利点は一度に公正取引のかなりのように見えます。 – Morwenn

+2

@Morwenn:ニコールがしようとしているところは、関数の中で正規表現を必要としない状況で 'constexpr'を使うと、' constexpr'はコンパイル時に評価できることです。つまり、実行時に関数呼び出しをトリガする可能性があります。また、 'constexpr'である関数は言語のサブセットしか使用できないので、とにかくそのような自然なデザインが得られないかもしれないことにも注意してください。 –

+3

@David:他のコンテキストで 'constexpr'関数を強制的にコンパイル時に' template のようなトリックを使って評価することができます。compile_time_dammit {enum {value = N}; }; ... compile_time_dammit :: value; '。質問への答えは 'constexpr'の長所と無関係です:-) –

13

constexprソリューションは全く異なる問題を解決します。 std::ratioは、数学的ツールとしてではなく、異なる単位を使用する変数間の橋渡しとして使用するために作成されました。このような状況では、必ず比率がタイプの一部であることが必要です。 constexprソリューションはそこでは機能しません。たとえば、ランタイム・スペースおよびランタイム・コストなしでstd::durationを実装することはできません。なぜなら、各期間オブジェクトは、オブジェクト内の指定子/分母情報を運ぶ必要があるからです。

+0

Dittoは合理的なライブラリですが、さまざまな次元の分数あなたはa)実際の分数を3つか5つ持ち歩きたくない場合、b)dist + timeを実行時エラーではなくコンパイラ・タイプのエラーにしたい場合。 – emsr

関連する問題