問題タブ [c++03]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++03 の浮動小数点値に最も近い整数
一部の整数型では、浮動小数点値が整数の表現可能な範囲をはるかに超えている場合でも、浮動小数点型の値に最も近い値を見つけるにはどうすればよいですか。
またはより正確には:
浮動F
小数点型にします (おそらくfloat
、double
、またはlong double
)。I
整数型にしましょう。
と の両方が の有効な特殊化を持っているF
と仮定します。I
std::numeric_limits<>
の表現可能な値が与えられ、F
C++03 のみを使用して、表現可能な最も近い値を見つけるにはどうすればよいI
ですか?
私は、純粋で効率的でスレッドセーフなソリューション、および C++03 によって保証されていること以外はプラットフォームについて何も想定していないソリューションを求めています。
そのような解決策が存在しない場合、C99/C++11 の新機能を使用して解決策を見つけることは可能ですか?
C99 の使用lround()
は、ドメイン エラーが報告される方法が自明ではないため、問題があるようです。これらのドメイン エラーは、移植可能でスレッド セーフな方法でキャッチできますか?
注: Boost はおそらくそのboost::numerics::converter<>
テンプレートを介してソリューションを提供することを認識していますが、その複雑さと冗長性が高いため、そこから本質的な要素を抽出できていないため、それらのソリューションが有効かどうかを確認できませんでした。 C++03 を超える仮定。
I(f)
次の素朴なアプローチは、 の整数部分がf
の表現可能な値ではない場合、の結果が C++03 によって定義されないという事実のために失敗しますI
。
次に、次のアプローチを検討してください。
F(std::numeric_limits<I>::min())
と の不可欠な部分がでF(std::numeric_limits<I>::max())
表現できない可能性があるため、これも失敗しますI
。
最後に、これも失敗するこの 3 番目のアプローチを検討してください。
今回I(f)
は常に明確な結果が得られますが、F(std::numeric_limits<I>::max())
よりもはるかに小さい可能性があるため、 未満の複数の整数値である浮動小数点値をstd::numeric_limits<I>::max()
返す可能性があります。std::numeric_limits<I>::max()
std::numeric_limits<I>::max()
F(i)
変換が最も近い表現可能な浮動小数点値に切り上げるか切り下げるかは未定義であるため、すべての問題が発生することに注意してください。
C++03 (4.9 Floating-integral conversions) の関連セクションは次のとおりです。
整数型または列挙型の右辺値は、浮動小数点型の右辺値に変換できます。可能であれば、結果は正確です。それ以外の場合は、表現可能な次の低い値または高い値の実装定義の選択です。
c++ - リンク時エラーではなく、インスタンス化されていないテンプレートメンバーのコンパイル時エラー
ItemContainer
ソート、インデックス作成、グループ化などのさまざまな機能を備えたコンテナのファミリ全体のファサードであるテンプレートクラスがあります。
実装の詳細は、cpp.
pimplイディオムと明示的なインスタンス化を使用してファイルに隠されています。テンプレートは、コンテナの実際の動作を定義する、よく知られた限定された実装クラスのセットでのみインスタンス化されます。
メインテンプレートは、すべてのコンテナでサポートされている共通の機能を実装しています- IsEmpty()
、など。GetCount()
Clear()
それぞれの特定のコンテナは、それによってのみサポートされるいくつかの機能を専門としています。たとえばSort()
、ソートされたコンテナ、operator[Key&]
キーインデックス付きコンテナなどです。
そのようなデザインの理由は、クラスが90年代初頭にいくつかの先史時代によって書かれたいくつかのレガシーの手作り自転車コンテナの代わりになるためです。アイデアは、古い腐敗した実装を最新のSTL&Boostコンテナに置き換え、古いインターフェイスを可能な限りそのままにしておくことです。
問題
このような設計は、ユーザーがサポートされていない関数を特定の専門分野から呼び出そうとすると、不快な状況につながります。コンパイルはOKですが、リンクステージでエラーが発生します(シンボルが定義されていません)。あまりユーザーフレンドリーな動作ではありません。
例:
もちろん、特殊化の代わりに継承を使用することで完全に回避することはできますが、1〜3個の関数を持つクラスをたくさん作成するのは好きではありません。オリジナルのデザインを維持したい。
リンクステージ1ではなくコンパイルステージエラーになる可能性はありますか?どういうわけか静的アサーションが使える気がします。
このコードのターゲットコンパイラはVS2008であるため、実用的なソリューションはC ++ 03互換である必要があり、MS固有の機能を使用できます。ただし、ポータブルC++11ソリューションも歓迎します。
ソースコード:
c++ - C++11 ソース コードを含む C++03 ライブラリ
C++03 で記述されたライブラリがあり、それをスタティック ライブラリにコンパイルした場合、C++11 で使用できますか? 逆も可能です( C++03 を使用した C++11 静的ライブラリ )。
更新: 私が使用しているコンパイラは clang または LLVM です
c++ - C と C++ の特定の標準の違い
C++11 と C99 のすべての違いはどこで確認できますか?
C89/C90がベースのC++98やC++03だと思います。それらの間に違いはありますか?C++11 と C99 はどうですか? C99 の一部の機能は C++11 に追加されましたが、他の機能 (複合リテラル、VLA など) は追加されませんでした。この変更の完全なリストを見ることはできますか?
c++ - C++03 対応のコンパイラでは、どの Boost バージョンを使用すればよいですか?
私のコンパイラは C++03 をサポートしています。したがって、どのバージョンのブーストを使用する必要がありますか? 以前のバージョンの C++ を使用していた場合、ブースト バージョンを確立するにはどうすればよいですか?
c++ - テンプレート引数がゼロのときにテンプレートのインスタンス化を防ぐ
テンプレート化されたクラスがあります
Size引数がゼロの場合、このテンプレートのインスタンス化を防ぎたいです。つまり、次のコンパイラ警告を生成します。
しかし、他のすべてのバリアントは機能します。
boost :: enable_if_cの使用を検討していますが、それを機能させる方法がわかりません。
-更新-残念ながら、c++11の機能は使用できません
visual-c++-2008 - C++03 での参照の崩壊
バインドされたメンバー関数から述語を作成する必要があるため、boost::function<bool(SomeObject const &)>
. それは問題ないようですが、1つのケースでそれを否定する必要もありました。でも
MSVC++ 9.0 (Visual Studio 2008) でコンパイルされず、参照への参照が無効であると不平を言う:
問題は、 asをboost::function
定義し、インスタンス化された by が内部的に使用しようとし、既に参照されているため、コンパイラがそれを拒否することです。C++11 でコンパイルできることは確かですが、これは C++03 のみの古いコンパイラです。だから私はそれが誰のせいなのか知りたい:argument_type
SomeObject const &
std::unary_negate<_Fn1>
std::not1
const typename _Fn1::argument_type&
T::argument_type
- コンパイラの、参照を折りたたむ必要があるため(明らかにそうではありません)、
- 標準ライブラリの、参照を取るファンクターを処理する準備ができている必要があるため (仕様では引数で定義
unary_negate
されているため、明らかにそうではありません)、const typename Predicate::argument_type& x
- ブーストの、
argument_type
実際の引数が or の場合でも参照されるべきではないため boost::function
参照引数と一緒に使用してはならないので、私のものですか?
c++ - 乱数ジェネレーター: シングルトンとして使用する必要がありますか?
私はいくつかの場所で乱数を使用しており、通常は必要に応じて乱数ジェネレーターを構築しています。現在、私は Marsaglia Xorshift アルゴリズムを使用して、現在のシステム時刻をシードしています。今、私はこの戦略についていくつかの疑問を持っています: 複数のジェネレーターを使用する場合、ジェネレーター間の数値の独立性 (ランダム性) はシード (同じシードと同じ数値) に依存します。時間 (ns) をシードとして使用しているため、この時間が変更されるため、これは機能しますが、単一のジェネレーターを 1 つだけ使用して、シングルトンとして使用できるようにする方がよいのではないかと考えています。これにより、乱数の品質が向上しますか?
編集: 残念ながら、c++11 はまだオプションではありません
編集:より具体的に言うと、シングルトンが乱数の品質を向上させる可能性があることを示唆しているわけではありませんが、1 つのジェネレーターのみが使用され、シードされているという事実です。それ以外の場合は、異なるジェネレーターのシードが別のジェネレーターから独立 (ランダム) であることを確認する必要があります。極端な例: まったく同じ数の 2 つのジェネレーターをシードします -> それらの間にランダム性はありません
c++ - new の配置を損なうことなく、デバッグ バージョンで new をオーバーライドする
Microsoft ランタイム ライブラリは、割り当て関数のデバッグ バージョンを提供します。C++ の場合、これは署名付きの演算子 new のデバッグ バリアントです。
マクロは次のように定義されます
すべての割り当てを計測するために、通常は次のように定義します
ただし、この定義は、placement new を使用するすべての場所を壊します。これは、2 つの引数セットが構文エラーになるためです。これで、コード内のいくつかの使用法を簡単に処理できるようになりましたが、標準ライブラリとブーストはいたるところに新しい配置を使用しています。したがって、これをグローバルに定義すると、定義の前に多くのものを含めることになり、コンパイルが遅くなります。
では、placement new が含まれているという理由だけで、すべてのファイルに上記の最後の定義を配置したり、手動で DEBUG_NEW を記述したりする必要なく、ヘッダーを取得せずにコードで割り当てを計測する方法はありますか?
c++ - MSVC++ でのメモリ アロケータのオーバーライド
Microsoft 標準ランタイムは割り当て関数のデバッグ バージョンを提供しますが、実際には機能しません。C++ コードでネイキッド new を使用することは想定されていないため、インストルメンテーションは標準ライブラリを指すか、標準ライブラリをインストルメントできないためどこにもポイントしません。
これで、割り当てのバックトレースを生成 (および記録) できるコードができ、DUMAも使用しました。ただし、ストリームを使用した場合、割り当て関数を置き換える試みは失敗しました。これstreambuf
は、いくつかのデバッグバリアントへの呼び出しが、new と delete の間で一貫性がないためです。
Microsoft標準ランタイムで、いプリプロセッサのトリックではなく、関数をオーバーライドすることにより、アロケータを置き換えた経験がある人はいますか? デバッグ アロケータを回避する必要があると思われますが、明らかな理由で定義を維持したいと考えてい_DEBUG
ます (より多くのデバッグ コードがそれに依存しています)。
注: 現在、Visual C++ 9.0 (Visual Studio 2008) に固執しています。
編集: C++ 標準ライブラリは、割り当てが 1 つによって行われる可能性があるため、ライブラリにコンパイルされた関数とインスタンス化、およびユーザー コードで生成されたインスタンス化との間で、new と delete の一貫した定義を持つ必要があるため、デバッグ アロケータを回避することはほとんどありません。他の人によって解放されます。ちなみに、force-included ヘッダーで静的なインライン バリアントを定義しても、うまくいかない可能性があります。
Edit2: Windows は特定の DLL からシンボルをバインドするため、動的リンクでは不可能です。そのため、リンク時にそれらをオーバーライドする方法はありません。ただし、動的リンクは必要なく、使用しません。これは、プライマリ ターゲットが WinCE であり、静的リンクがデフォルトであるためです。