問題タブ [boost-any]
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++ - plist ファイルの読み取り時のキャストの問題を後押しします
Visual C++ で plist ファイルからデータを読み取っています。
ファイル内のデータは次のようなものです。
Caminando_001.png x y 幅 高さ offsetX offsetY originalWidth originalHeight
xキー値まで読んでから、次のようなことをします
int Left = boost::any_cast(iter->second); //iter はペア std::string boost::any
その最後の行は例外 (不正なキャスト) をスローし、何が問題なのかわかりません。
c++ - any コンテナの実装
私は と をよく知ってboost::any
いboost::variant
ますが、この場合、それらは私のニーズに合いません。
通常、不明なタイプのオブジェクトを含めるには、共通ベースから派生させ、仮想メソッドを介してインスタンスにアクセスします。しかし、共通のベースを使用することが不可能な場合はどうすればよいでしょうか?
この例では、含まれている型を知る必要があることはわかっていますが、ご容赦ください。std::vector
トップレベルクラスもテンプレートであるテンプレートクラスです。私の知る限り、STL ヘッダーを変更せずに非テンプレート ベースを指定することはできません。ここで、単一の型のベクトルを作成したいとしますが、それを含むクラスはその型を気にしませんが、いくつかの「共通」メソッドへのアクセスを必要とsize()
しpop_back()
ます。
を使用するboost::any
と、型が消去され、含まれているオブジェクトを逆参照することがほとんど不可能になります。boost::variant
また、tuple
挿入される可能性のある型を事前に知っておく必要があり、それを含むクラス自体がテンプレートになります。
私がこれまでに持っているものは次のようなものです:
ここでクライアントが呼び出すことができcreate()
、テンプレート パラメータは自動的に決定されます。私が知っている良い例ではありませんが、クライアントからテンプレート パラメーターを隠そうとしています。これを行わないsome_class
と、保存されているタイプも追跡する必要があります。
私のメソッドは、特に内部クラスに独自の仮想メソッドがある場合に、パフォーマンスの低下を引き起こす仮想呼び出しに依存しています。
私のニーズにより適した他のタイプのコンテナはありますか?
理想的には、私はこのようなものが欲しい
仮想メソッドに依存するのではなく、内部的に型を追跡し、単純なキャストを行う場所。違いauto
は、一度宣言すると型が変わる可能性があるということです。
編集:
実際には、ラッパーを作成したいと思いますstd::basic_filebuf
。char
このラッパー クラスは、wchar_t
またはunsigned long
BOM に基づいてファイルを開きます。basic_filebuf
ラッパーは、クライアントが選択したものであるテンプレート パラメーターからも派生します。内部的には、Unicode コード ポイントをファイルからクライアントが希望するエンコーディングに変換します。内部を格納するときに問題が発生しbasic_filebuf
ます。これは、テンプレート パラメーターとして任意の型で宣言できるためです。basic_filebuf
クライアントが独自のインスタンスを渡せるようにしたいので、テンプレートの特殊化を使用したくありません。
C++11 の機能が制限されている VS2010 と互換性がある必要があります。
c++ - オブジェクト ディレクトリを実装します: boost::any、boost::variant、または?
さまざまな種類のオブジェクトを格納するディレクトリ オブジェクトを実装したいと思います。名前でオブジェクトにアクセスし、実際のポインター型を取得してシリアル化できる必要があります。私が考えているオブジェクトは次のようになります。
「SomeType」はBoost::variantを使おうと思っていました。しかし、実行時にオブジェクト タイプをバリアント リストに追加する必要があるようです。先のディレクトリのオブジェクトタイプを知っていても、
whereTypelist
はディレクトリごとに異なります。次に、dirs の dir を持つことは、Typelist の動的結合になります。複雑に見えます。そして、まもなく 50 のバリアント タイプの制限に達します。セマンティクスを簡素化するための代替手段は Boost::Any です。しかし、私はオブジェクトのセットを繰り返し処理したいと思います-各オブジェクトはboost::fusion adapt_structです-各オブジェクトの各メンバーでfusion::for_eachを行い、それらを表示したいと思います. 代替案や提案はありますか?
c++ - boost::any が文字列リテラルを保持しないのはなぜですか?
コメントされたコード行がコンパイルされません。なぜですか? 文字列リテラルはほとんどの状況で char* として機能すると思いますが、これは r-value と l-rvalue に関連していますか?
エラー メッセージ: test_boost_any.cc
c++ - Boost::保存された値への参照がコンパイルされていない
次のようなパラメーターを保持する汎用構成クラスを作成しようとしています (大幅に簡略化されています)。
問題はadd_parameter_group
関数にあります:
リターンはメッセージでコンパイルに失敗します
理由がわかりません。ドキュメントによるとboost::any_cast
:
ポインターが渡された場合、成功した場合は値の内容への同様に修飾されたポインターを返します。それ以外の場合は null が返されます。T が ValueType の場合、保持されている値のコピーを返します。それ以外の場合、T が (おそらく const 修飾された) ValueType への参照である場合、保持されている値への参照を返します。
本来あるべきように参照を返さないのはなぜですか?