2つの同様の構造AとBがあるとします。AとBの両方にAへのポインタがありますが、AにはAまたはBへの追加ポインタがあります。C++:Baseクラスの派生クラスのみの変数を使用
私は基本と派生クラスAがDerived<0>
であり、BはDerived <1>
ある
template <bool T> struct Derived;
struct Base { Derived<0> *p1; };
template <> struct Derived<0> : public Base { Base *p2; };
template <> struct Derived<1> : public Base {};
でこのような何かを考えました。
ここでの問題は、p2
でクラスにアクセスすると、コンパイラはそれがどの派生クラスであるのかわからないため、このようなエラーが発生します。
Derived<0> x, y, z;
x.p2 = &y;
y.p2 = &z;
x.p2->p2; // Error
あなたは魔法の回避策を知っていますか、できればコンパイル時の機能のみを使用していますか?
また、どのタイプのDerivedを使用しているかを知る必要があるため、p2を使用できるかどうかはわかります。
それが助け場合は、p1
が前ポインタで、p2
が次ポインタである、Derived<1>
がエンド・ノードで、Derived<0>
は通常のノードである二重リンクリスト、として物事を視覚化することができます。
編集:Base-and-Derived-class-type構造を使用する必要はありません。何でも構いません。
'x.p2'が' Base'へのポインタで、 'p2'のメンバーを持たず、' - > p2'が何かに解決できないので、エラーです。 'dynamic_cast>(x.p2)'を実行し、結果が 'nullptr'でないかどうかを確認できます。そうでなければ、キャストされたポインタを通して ' - > p2'にアクセスできます。 –
cdhowie
(条件付きで正しくキャストするには、基本クラスが 'dynamic_cast'のために多相でなければならないことに注意してください) – cdhowie