問題タブ [reinterpret-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.
com - 定義済みの COM インターフェイスを介してカスタム データを渡す
サードパーティの COM サービスを使用しています。.NET アセンブリから公開されます。このサービスが提供するいくつかのインターフェイスがあり、実際に C++ アプリケーションで (事前バインディングを使用して) 使用できます。実際には、これらのインターフェイスを使用してカスタム データを渡すことができるかどうかを知りたいです。つまり、これらのインターフェイスが提供するものでは十分ではなく、そこにいくつかのデータ/メソッドを追加したいと考えています (ただし、インターフェイスは私のものではないため、できません)。それを変更)。可能であればアドバイスをお願いします。そうでない場合は、回避策があるかもしれません (例は非常に役立ちます)。
サードパーティの COM サービスを介してプロデューサーからコンシューマーにカスタム データを渡すことができるかどうかを理解しようとしています。自分のメソッドを含み、サードパーティの ISomething を継承する独自のインターフェイスを作成して使用する必要があるのでしょうか?
以下は、問題を示すコードです。助けてくれて本当にありがとうございます...
1)プロデューサーからコンシューマーにデータを渡すために使用しているクラス(サードパーティのCOMサービスを介して):
2) データ プロデューサーがデータを入力し、それをサード パーティの COM サービスに渡します。
3) 私のデータ コンシューマは、定義済みデータと未定義データの両方を取得しようとしますが、定義済みデータの取得にのみ成功し、未定義にはガベージが含まれます
c++ - オブジェクトとして使用されるカプセル化された char 配列は厳密なエイリアシング ルールに違反しますか
次のクラスは厳密なエイリアシング ルールを破ります。
私の標準の読みは、それが正しくないということですが、よくわかりません (私の使用法は、オブジェクトの配列T
+ それらのオブジェクトのいくつかのメタデータを持ちますが、メモリを手動で割り当てずにオブジェクトの構築/分解を制御することです)。標準での配置の例として使用されnew
ます。
c++ - 新しいオブジェクトを割り当てることなく、ポインタキャストのみを介して交換可能なクラスタイプを作成しますか?
更新:「それは望まない、代わりにこれが欲しい」という提案に感謝します。それらは、特にやる気を起こさせるシナリオのコンテキストで提供される場合に役立ちます。それでも...善/悪に関係なく、私は「C++11で合法的に行うことができるはい」と「いいえそのようなことを行うことは不可能」を見つけるのが難しいことに興味を持っています。
いくつかのヘルパーメソッドを追加することのみを目的として、オブジェクトポインタを別のタイプとして「エイリアス」したいと思います。エイリアスは、基になるクラスにデータメンバーを追加できません(実際、それが発生するのを防ぐことができれば、それだけうまくいきます!)すべてのエイリアスは、このタイプのすべてのオブジェクトに等しく適用できます...型システムが次のことを示唆できる場合に役立ちます。エイリアスがおそらく最も適切です。
基になるオブジェクトにエンコードされた特定のエイリアスに関する情報はありません。したがって、型システムを「ごまかす」ことができ、それを注釈にすることができるはずです...コンパイル時にチェックされますが、最終的にはランタイムキャストとは無関係です。これらの線に沿った何か:
内部的には、ファクトリメソッドは実際にNodeBase
クラスを作成し、同様のものを使用してreinterpret_cast
それをとして返しNode<AccessorFoo>*
ます。
これを回避する簡単な方法は、ノードをラップし、値によって渡されるこれらの軽量クラスを作成することです。したがって、キャストは必要ありません。ノードハンドルを取得してコンストラクターでラップするAccessorクラスだけです。
しかし、私がそのすべてにお金を払う必要がなければ、私はしたくありません。これには、たとえば、ラップされたポインターの種類ごとに特別なアクセサー型を作成することが含まれます(AccessorFooShared、AccessorFooUnique、AccessorFooWeakなど)。これらの型付きポインターは、単一のポインターベースのオブジェクトIDに対してエイリアス化されることが望ましく、素敵な直交性。
では、元の質問に戻りましょう。
これを行うには、醜いかもしれないが「ルールを破る」ことはできない方法があるようです。ISO14882:2011(e)5.2.10-7によると:
オブジェクトポインタは、別のタイプのオブジェクトポインタに明示的に変換できます。70タイプ「pointertoT1」のprvaluevがタイプ「pointertocv T2」に変換されると、結果はstatic_cast(static_cast(v))になります。 T1とT2の両方が標準レイアウトタイプ(3.9)であり、T2のアライメント要件がT1のアライメント要件よりも厳密でない場合、またはいずれかのタイプが無効である場合。タイプ「pointertoT1」のprvalueをタイプ「pointertoT2」(T1とT2はオブジェクトタイプであり、T2のアライメント要件はT1の要件よりも厳密ではない)に変換して元のタイプに戻すと、元のタイプが生成されます。ポインタ値。他のそのようなポインタ変換の結果は指定されていません。
「標準レイアウトクラス」の定義を掘り下げると、次のことがわかります。
- タイプnon-standard-layout-class(またはそのようなタイプの配列)または参照の非静的データメンバーがなく、
- 仮想関数(10.3)と仮想基本クラス(10.1)がなく、
- すべての非静的データメンバーに対して同じアクセス制御(11節)があり、
- 非標準レイアウトの基本クラスはなく、
- 最も派生したクラスに非静的データメンバーがなく、非静的データメンバーを持つ基本クラスが多くても1つないか、非静的データメンバーを持つ基本クラスがない。
- 最初の非静的データメンバーと同じタイプの基本クラスはありません。
このようなもので作業することは、アクセサーまたはノードに仮想メソッドがない状態で私の手を少し縛るようなもののように聞こえます。それでも、C++11は明らかにstd::is_standard_layout
物事をチェックし続けなければなりません。
これは安全に行うことができますか?gcc-4.7で動作するように見えますが、未定義の動作を呼び出さないようにしたいと思います。
c++ - const void * は void * に対してどのような価値を提供しますか?
C++ では、const void *
関数の引数の型に a を使用する価値はありvoid *
ますか? a は不透明なので、ユーザーがを行う場合void *
以外に変更のリスクはありますか? 問題を回避するために特殊化を提供する共有ポインタ用のユーティリティ テンプレート クラスを使用していたが、特殊化が提供されていなかったので、これは単なる見落としであったのか、それとも決して必要ではないのでしょうか?reinterpret_cast
const_cast
const void *
void
void &
const void
c++ - Reinterpret_cast vs プレースメント new
この投稿を読むと、事前に割り当てられたメモリ位置でクラス コンストラクターを呼び出すために C++ の配置ニュースが使用されていることが明らかです。
メモリが既に初期化されている場合、新しい配置または reinterpret_cast のどちらがより適切ですか?
たとえば、フレーム化されたメッセージを表す生のバイト ストリームを TCP ソケットから読み取ったとします。このストリームを framesync に入れ、クラスを表す既知のサイズのバッファーを取得します。これを Message と呼びます。私は、次の 2 つの方法を知っています。
クラスに初期化しないように指示するフラグを受け取るコンストラクターを作成します。「初期化しない」フラグを渡してバッファに新しい配置を行います。
/li>reinterpret_cast を使用する
/li>
どちらも同じ結果になると思います。どちらがより正確で、よりオブジェクト指向で、より安全で、読みやすく、またはより良いスタイルであるため、どちらが好まれますか?
c++ - %p 指定子は有効なポインターのみですか?
私のプラットフォームsizeof(int)==sizeof(void*)
で、次のコードがあるとします。
の代わりに有効なポインターではない値を渡すため、これは未定義の動作になり%p
ますか?
c++ - reinterpret_cast、兄弟クラスへのキャスト
次のC++コードが動作することが保証されているかどうか疑問に思っています:
もちろん、なぜこれが必要なのですか?これを置き換えたいので:
より良い構造で(型の安全性を2回チェックしないように、パフォーマンスによって):
前もって感謝します!
c++ - C スタイルのキャストは機能するのに、reinterpret_cast が機能しないのはなぜですか?
だから私は2文字の配列を持っています
v[0]の値を0から255までの数値で表示したいのですが、
だから私は試しました
また
これはまさに私が望んでいたことを示していますが、まったく好きではありません。また、私がまったく理解していないのは、これが機能しない理由です:
c++ - reinterpret_castおよびnullメンバー変数
私は次のようなreinterpret_castを使用しています:
メソッド内では、ほとんどのメンバー変数(すべてのハンドル)がnullです。同じアドレスが保証されないことがわかっているので、これはreinterpret_castが原因でしょうか?static_castのように。この場合はstatic_caseを使用する必要があることはわかっていますが、この問題に興味を持ったのです。