問題タブ [boost-optional]
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++ - ブール値へのオプションの暗黙的な変換をブーストしますか?
私はいくつかのコードを読んでいて、理解できないものに出くわしました。Boost::optional 値が初期化されているかどうかをテストします。マクロを提供する gtest フレームワークを使用しますASSERT_TRUE()
。
なぜ!!
beforeが必要なのopt
ですか? boost::optional
マクロに必要な bool に暗黙的に変換されていませんか? ASSERT_TRUE(opt)
opt が正しい値を保持しているかどうかを確認するために使用するだけで十分だと思いましたか?
c++ - ポインターを返すことができるのに boost::optional を使用する理由
find
必要なものが見つからないことがある関数がある場合、その関数がポインタを返すようにして、 a が見つからなかったことを示すようにする傾向がありますnullptr
。
例えば
Student が存在する場合は、見つかったStudent
オブジェクトへのポインターを返します。それ以外の場合は、を返しnullptr
ます。
私boost::optional
もこの目的のために支持されているのを見てきました。たとえば、「何も返さない」関数を実装したい場合、boost::optional をいつ使用し、いつ std::unique_ptr を使用しますか?
私の質問は、この場合、ポインターを返さないのが最善の解決策ではないということです。すなわち、照会された項目が見つからない可能性があります。その場合、nullptr を返すことは完璧な解決策です。boost::optional
のようなもの(または他の同様のソリューション)を使用する利点は何ですか?
findStudent
私の例では、 が所有するオブジェクトへのポインタのみを返すことに注意してくださいSomeClass
。
python - boost::optional を使用して boost::python をラップする
型オブジェクトをラップboost::optional<T>
して公開する方法はありますかboost::python::class_
(から使用BOOST_PYTHON_MODULE
)
この場合、Pythonで期待するのは AttributeError です
の値がbar
まだ設定されていないためです。そしてTypeError
いつ
bar
int
タイプです。
boost::python::indexing_suite
もう 1 つの関連する問題は、コンテナー型のクラスのオブジェクトを同じ方法でエクスポートすることです。
boost::python
問題はapiを使用して解決できますか?
c++ - 複数の表現を持つアイテムの C++ デザイン パターン
データを 3 つの方法で表現できる「アイテム」があります。ランタイム コストで、ある表現から他の表現に変換できます。変換を行ったら、新しい表現を維持したいと思います。コアデータを「変更」することなく、データの表現を他の表現に変換できます。ランタイム コストがかかるため、データの 3 つの表現を含むクラスが必要です。いつでも、そのうちの 1 ~ 3 個が有効になります。
これの本当のポイントは、ユーザーが何かを要求できるアクセス方法もあるからです。この何かは、1 つ以上の表現から取得できます。たとえば、表現 1 から「範囲」を取得し、表現 2 または 3 から「ボリューム」を取得できます。
私の解決策は、メンバーデータとして3つの表現を持つクラスを作成することでした(そしてそれらが有効かどうかを知る方法)。次に、必要な表現を内部的に認識し、必要に応じて作成する getRange() メソッドを作成しました。これは正常に機能し、get メソッドを const にできないことを除いて、すべての問題を解決します。
したがって、このソリューションの実際の問題は、このクラスの「定数」インスタンスでさえ、内部的に他の表現を作成する可能性があるため、実際には const ではないことです。ただし、表現を変更してもコアデータは変更されないため、実際には「一定」です。
このクラスに役立つ C++ デザイン パターンはありますか? 助言がありますか?
c++ - ブーストオプションは継承を認識しますか?
func は、基本と派生の両方のオプションを受け入れますか?
c++ - 範囲ベースの for ループ式の一時的なオプション
を返す関数があるとしますstd::optional<A>
。では、範囲ベースの for ループで結果を使用する適切な方法は何ですか? 最も簡単な方法は機能しません。
T optional::value() &&
の代わりにがあれば、この問題は存在しませんT&& optional::value() &&
が、STL と Boost の両方が 2 番目の方法で定義しています。
この状況を処理する適切な方法は何ですか? 私が考えることができる両方のソリューションが好きではありません(サンドボックス):
c++ - boost::optional タイプの説明が必要
boost::optional 型変数に関して、コア ファイルから取得したいくつかの詳細を理解しようとしています。
変数:
コアからのフレーム #5:
このフレームで実行されている行は次のとおりです。
その結果、クラッシュに至るまでのいくつかのフレームは、ライブラリ コードを後押しすることを示しています。
フレーム #0 は のデストラクタCacher
が呼び出される場所であり、クラッシュはオブジェクトが保持するメモリが既に解放されているためです。
私の質問:
boost::optional
によって保持されているメモリcacher_
が有効であることを示していますか?boost::none
に割り当てた結果cacher_
、オブジェクトは破棄されますか?
問題を診断するための詳細が不十分な場合は、お詫び申し上げます。回答に基づいて、追加の詳細を提供しようとします。
ありがとう!
c++ - boost::optional による例外のキャッチとラップ
boost::optional
ライブラリ コードによって生成された例外をキャッチし、それらをs (または)でラップしたいと考えていますstd::experimental::optional
。私のコードは些細なケースでは機能しますが、オーバーロードされた関数を呼び出すときに正しい型を推測するのは困難です。テストケースをこれに減らしました:
「壊れた」例をコンパイルしようとすると、次の出力が得られます。
正しい型の関数ポインタを作成することで問題を回避できますが、これは理想的ではありません。私の問題の解決策はありますか、それとも醜い関数ポインタのハックに悩まされていますか?
乾杯、ライアン
c++ - boost/optional.hpp をインクルードする場合の C2143 構文エラー
理解できないコンパイル時エラーで立ち往生しています。boost::optional
コードで使用しようとしましたが、インクルードするとすぐboost/optional.hpp
にプロジェクトをビルドできなくなりました。この include ステートメントをコメントアウトすると、機能します。クラス ヘッダーの include ステートメントだけです (以下の完全なboost::optional
ヘッダーを参照)。コンパイラ エラーはC2143 syntax error: missing ',' before '<'
、別の Boost ヘッダーで発生するものですboost/utility/compare_pointees.hpp
(以下の GitHub リンクを参照)。同じプロジェクトのように、Boost の他のものもうまく使用しboost::filesystem::path
ているので、Boost ディストリビューション自体に問題はないはずです。
ここに私の環境があります:Microsoft Visual Studio Professional 2015 Version 14.0.25431.01 Update 3
とboost 1.62.0
. 私はサードパーティのライブラリC++ REST SDKも使用しています。それ以外はすべて C++ 標準ライブラリのものです。
私のヘッダーは次のようになります。boost::optional<size_t>
戻り値の型として新しいメソッドを追加したい。
コンパイラ エラーが報告される場所は、Boost ヘッダーboost/utility/compare_pointees.hpp
の 36 行目です。このファイルの全内容は、GitHub のhttps://github.com/boostorg/utility/blob/boost-1.62.0で確認できます。 /include/boost/utility/compare_pointees.hpp
コンパイラの出力には、次のメッセージしか表示されません。
Boost ライブラリの問題ではありません。しかし、クラスやプロジェクトの設定の何が問題なのか、どうすればわかりますか?
PS プロジェクトでこれらの最も基本的なヘッダーとソース ファイルを使用しても、動作を再現できます。
ヘッダファイルTest.h
:
ソースファイルTest.cpp
: