【发布时间】:2018-01-20 09:17:53
【问题描述】:
假设我有两个相似的结构 A 和 B。A 和 B 都有一个指向 A 的指针,但 A 有一个指向 A 或 B 的附加指针。
我想到了这样的东西,有一个 Base 和一个 Derived 类
template <bool T> struct Derived;
struct Base { Derived<0> *p1; };
template <> struct Derived<0> : public Base { Base *p2; };
template <> struct Derived<1> : public Base {};
其中 A 是 Derived<0>,B 是 Derived <1>。
这里的问题是当通过p2访问一个类时,编译器不知道它是哪个Derived类,这样就会报错。
Derived<0> x, y, z;
x.p2 = &y;
y.p2 = &z;
x.p2->p2; // Error
你们中是否有人知道任何神奇的解决方法,最好只使用编译时功能?
我还需要知道我使用的是哪种类型的 Derived,以便我知道我是否可以使用 p2。
如果有帮助,您可以将事物可视化为双链表,其中Derived<0> 是普通节点,Derived<1> 是结束节点,p1 是 prev 指针和p2 是 next 指针。
编辑:它不需要使用Base-and-Derived-class-type结构,它可以是任何东西。
【问题讨论】:
-
这是一个错误,因为
x.p2是指向Base的指针,它没有p2成员,因此->p2无法解析任何内容。您可以dynamic_cast<Derived<0>>(x.p2)并检查结果是否不是nullptr。如果不是,那么您可以通过强制转换的指针访问->p2。 -
(注意基类必须是多态的,
dynamic_cast才能有条件地正确转换。)
标签: c++ templates template-specialization derived-class