問題タブ [dynamic-cast]
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++ - 非ポリモーフィック型の mixin テンプレートの型の互換性を判断する方法
ミックスインが次のように定義されている場合...
...そして、T が非ポリモーフィック クラスであることを宣言します...
..そして、それへの基本クラスのポインタを持っています...
...後で nonPolyPtr が Mixin タイプを指していることを確認するにはどうすればよいですか?
基本クラスは非ポリモーフィックであるため、上記はコンパイルされません。
Boost には役立つ特性クラスがいくつかあるのを見ましたが、見落としているより簡単な解決策があることを願っています。
c++ - 可変個引数テンプレートと動的キャスト
次のような C++ コードがあります。
私がやりたいのは、引数のそれぞれを B のそれぞれの型に動的キャストし、「キャストされた」引数で指定された関数 fun を呼び出すような方法で cast_all を実装することです。
たとえば、次のようになります。
cast_all は次のように展開する必要があります: foo(dynamic_cast(a1), dynamic_cast(a2));
可変個引数テンプレートに関する多くの記事を見てきました。しかし、数時間後、私はまだそれを理解することができません.
何か案は?
c++ - 本番コードで dynamic_casts を削除しても安全ですか?
dynamic_cast
s は低速ですが、s よりも安全ですstatic_cast
(もちろん、オブジェクト階層で使用する場合)。私の質問は、デバッグ コードですべての (動的) キャストが正しいことを確認した後、それらをstatic_cast
s に変更しない理由はありますか?
次の構成でこれを行う予定です。(ところで、より良い名前を思いつくことができますassert_cast
か? 多分debug_cast
?)
編集: Boost には既にこのための何かがあります: polymorphic_downcast
. それを指摘してくれたPlasmaHHに感謝します。
c++ - 動的キャストまたは関数のオーバーロード?
次の抽象クラスについて考えてみます。
ここで、この抽象クラスから複数の派生クラスを作成していると仮定します。ただし、それぞれが独自のタイプと比較する場合は異なるアルゴリズムを使用し、他の派生クラスと比較する場合は一般的なアルゴリズムを使用します。次の2つのオプションのうち、どちらがより良い、より効率的なオプションでしょうか?
オプションA:
オプションB:
C ++型キャストは私にとって比較的不思議なトピックであるため、これらのオプションにどのような長所と短所があるのか、私は本当に興味があります。さらに、どちらのソリューションがより「標準的」であり、2番目のソリューションはパフォーマンスに影響を与えますか?
おそらく3番目の解決策はありますか?特に、派生クラスが多数あり、それぞれが異なる派生クラスに対して独自の特別な比較アルゴリズムを必要としている場合はどうでしょうか。
c++ - C++ 一意のクラスのマッピングと値からのサブクラスの抽出
ここに新しい C++ プログラマーがいます。
次のマップ定義があります。
オプションは、私が作成した独自のクラスです。実際に Option クラスを自分のマップに追加することはありません。代わりに、常に Option から継承するクラスを追加しています。たとえば、int 変数を格納する IntOption というクラスがあります (それが行うすべて)。
次のようにして、IntOption をマップに追加しても問題ありません。
これはうまくいきます
値「追加」を返します。
さて、善良な皆さんへの私の質問は、戻り値からサブクラス変数を取得するにはどうすればよいですか? 私は次のことができます
しかし、私はできません
// getter は基本クラスではなく、Option を拡張するクラスにあるためです。
この問題を解決するにはどうすればよいですか?
typedef std::map MapType; を検討しました。
動的キャストを行う方法も、クラスへのポインターをマップに追加する方法もわかりません。
c++ - RTTI を無効にした dynamic_cast
RTTI を無効にし-fno-rtti
て (GCC または/GR-
Visual Studio で) 動的キャストを使用してコードをコンパイルするとどうなるか知りたいです。コンパイラは に「フォールバック」しstatic_cast
ますか? (少なくともVSでは)警告を発行するだけなので、コンパイルされたコードは何をしますか?
より具体的には、RTTI を使用せずに、dynamic_cast でエラーが発生しないと確信しているコード (つまり、dynamic_cast
安全に a に置き換えることができる場所static_cast
) を次のようにコンパイルすると、どのような問題が発生する可能性がありますか?
c++ - 多重継承を使用している場合、静的キャストはいつ安全ですか?
私は、何かがどのタイプであるかを知っている状況にいることに気づきました。Type は、3 つ (またはそれ以上) の継承レベルの 1 つです。私は返す factory を呼び出しますB*
が、T は型の最高レベル (私のコードがそれが何であるかを知っている場合) または 2 番目のレベルのいずれかです。
とにかく、私はstatic_cast
間違ったことをテンプレートで行いました。私の質問は、安全に静的キャストできるのはいつですか? そんな時ってありますか?この場合、動的キャストが無視する (そして null を返す) 奇抜なものとして T を誤って持っていると、むしろコンパイル エラーが発生するので、この場合に実行しました。ただし、正しい型がわかっている場合、ポインターが調整されないため、ポインターが正しくありません。この場合、静的キャストが許可される理由がまったくわかりません。
ダウン キャストに static_cast を安全に使用できるのはいつですか? 状況はありますか?今では、 a を使用するのは常に間違っているようですstatic_cast
(目的がダウンキャストである場合)
わかりました、それを再現する方法を見つけました。
c++ - ポインタを無効にするダイナミックキャストの実用的な使用法はありますか?
C ++では、構造は、成功するために動的型の継承階層に表示される必要がある他のポインター型へのT q = dynamic_cast<T>(p);
ポインターのランタイムキャストを実行します。それはすべて大丈夫です。p
T
*p
ただし、を実行することもできますdynamic_cast<void*>(p)
。これにより、「最も派生したオブジェクト」へのポインタが返されます(C++11の5.2.7::7を参照)。この機能はおそらくダイナミックキャストの実装で無料で提供されることを理解していますが、実際には便利ですか?結局のところ、そのリターンタイプはせいぜいですvoid*
、それでこれは何が良いですか?
c++ - ここでdynamic_castを取り除く方法は?
ゲーム用のシンプルなグラフィックエンジンを作成しています。
これはインターフェース部分です:
これは実装部分です:
ここでdynamic_castを使用するのは理にかなっていますか?それを回避する方法はありますか?
c++ - constテンプレート参照型がconst参照型と異なるのはなぜですか?
このテンプレートを検討してください。
タイプconst_ref_t
とanother_const_ref_t
は同等であると思います。どちらもconst T&
'sです。しかし、そうではありません。残念ながら、次の非等価性のデモンストレーションはかなり複雑です。dynamic_cast<>
別のクラスのタイプをチェックするために使用することに依存します。
申し訳ありませんが、これは非常に複雑ですが、質問を見つけた状況の簡略版です。
問題は、これです。このコードは、、、およびを同等のものとして扱いますconst int&
。foo< int >::const_ref_t
これfoo< int >::another_const_ref_t
は、typedefを考えると妥当と思われます。ただし、と同等にdynamic_cast<>
扱われるだけです。他の( )の場合はnullを返します。foo< int >::another_const_ref_t
const int&
foo< int >::const_ref_t
なんで?