这是情景:
class Base {
public:
typedef Base type;
};
class Derived: public Base {
public:
typedef Derived type;
};
我想要类似的东西:
int main() {
Base * bs = new Derived();
decltype(*bs)::type newvar;
}
如何在不使用静态/动态强制转换的情况下执行上述类似的操作来获取Derived类的类型?
答案 0 :(得分:2)
在您的代码中,*bs
实际上有两种类型:静态类型,即声明它的类型,即Base
。另一种类型是动态类型,它是它实际指向的对象的类型,在您的情况Derived
中。静态类型是编译时唯一已知的类型,无法更改。 TMP,普通函数调用和所有模板事件都发生在编译时,因此只有静态类型适用于那些。
仅使用动态类型的方法是向编译器明确说明,即调用虚函数或使用dynamic_cast
。
你说你想要“类似”你所展示的代码 - 你想用它完成什么?我很确定答案是“如果你想根据动态类型做事情,可以使用虚函数”,因为dynamic_cast
通常不是一个真正的选择。
答案 1 :(得分:1)
不,你不能那样做。
C ++是静态类型语言,这意味着必须在编译时确定类型
在示例bs
中,它不知道它指向的对象类型
请参阅下面的方案,以便更清楚:
Base * bs = (bool)? new Base() : new Derived();
您必须依靠virtual
机制或dynamic_cast
来实现您的最终目标。