0

未知の数値型へのポインターを定義することは可能ですか?intまたは、逆参照時にdouble常に特定の型、たとえば、を返しますか?double

これをやり始めて、

int    a = 7;
double b = 3.14;

void* c = static_cast<void*>(&a);
void* d = static_cast<void*>(&b);

double e = *(static_cast<double*>(c));
double f = *(static_cast<double*>(d));

しかしもちろん、 anint*を aにキャストすると意味double*不明な for が生成されるだけです。なぜなら、 an の内部ビットをあたかもフォーマットされているかeのように再解釈するからです。intdouble

確かにもっと良い設計オプションがあるはずなので、なぜこれを行う必要があるのか​​ を事前に真剣に答えようとしましたが、説明は冗長になりました。要するに、レガシーコードに関係しており、一部変更できない部分があり、影響を受けるコンポーネントをとにかく書き直すことを計画しているため、現在、回避策が可能かどうかを調査しています.

私の骨抜きバージョンが骨抜きになりすぎた場合に備えて、ここにもう 1 レベルの詳細があります。以前は (共有メモリ内の) へのポインターだったものを逆参照することにより、 を返さなければならないメソッドを使用していますが、現在は も指している可能性があります。ポインターが別の場所を指すように設定されたときに呼び出される「フック」があり、その時点でポインターが を指すか を指すかがわかります。したがって、私が考えられる唯一のことは、そのフック中にメンバー変数に型を格納 (またはフラグを設定) し、逆参照する前にその型のポインターにキャストすることです。doublevoiddoubleintdoubleint

しかし、誰かが私が見逃しているかもしれない便利なトリックやテクニックを知っていることを望んでいました. フックをまったく変更する必要がないように、ポインターを格納したり型を整理したりする他の方法 (他の説明が面倒な理由から、それを避けたいと思います)。

4

2 に答える 2

2

C++ は強く型付けされています。式(expr)は常に同じ静的型を持ちます。静的型が動的型の基本型である場合、可変動的型を持つことができます。ここでは明らかにそうではありません。

したがって、唯一の解決策は、両方のキャストを記述することです。

if (flag)
  std::cout << * static_cast<int*>(ptr);
else
  std::cout << * static_cast<double*>(ptr);

どちらの式も静的に決定される型を持ち、実行時に のデータに適した式 (したがって型) を選択しますptr

于 2013-07-29T14:32:37.837 に答える
1

C および C++ は、何かの型を「保存」しません。それはコンパイラによって認識されますが、コードがコンパイルされると、この情報は破棄されます。それはあなたが書いた式から出てきます - もちろん、 avoidは「これには型がない」ことを示す特別な型です。

コンテンツがintまたはdouble. それができない場合、それは「失敗」であり、実行できません。

于 2013-07-29T14:43:51.357 に答える