获取变量的类型

时间:2009-12-31 22:04:18

标签: c++ types typeof typeid

如果我理解正确,typeid可以确定多态中的实际类型,而typeof则不能。

它们的返回用于不同目的也是如此:typeof的返回用作可以定义变量的类型关键字,但是typeid的返回不能?

有没有办法同时获取多态的实际类型并使用return as type关键字来定义另一个变量?我希望从指向基类的指针获取派生类类型,并定义一个变量或指向派生类的指针。类似的东西:

baseclass *p = new derivedclass  
typexxx(*p) *pp = dynamic_cast<typexxx(*p) *> (p); 
// would like to convert the pointer from pointing to a base class 
// to its derived class

非常感谢!

2 个答案:

答案 0 :(得分:7)

c++0xdecltype可以像这样使用:

int someInt;
decltype(someInt) otherIntegerVariable = 5;

但是对于普通的旧c ++,不幸的是,没有。

我认为decltype也不会有太多帮助,因为你需要多态类型,声明的类型。做你想做的最直接的方法是尝试动态转换为特定类型并检查NULL

struct A {
    virtual ~A() {}
};
struct B : public A {};
struct C : public A {};

int main() {
    A* x = new C;
    if(B* b_ptr = dynamic_cast<B*>(x)) {
        // it's a B
    } else if(C* c_ptr = dynamic_cast<C*>(x)) {
        // it's a C
    }
}

答案 1 :(得分:3)

假设等级A&lt; -B < - C

A * p = new AorBorC;   // create new object of some sort

if ( dynamic_cast <C*>(p) ) {
  C * c = dynamic_cast <C*>(p);
  c->CFunc();
}
else if ( dynamic_cast <B*>(p) ) {
  B * b = dynamic_cast <B*>(p);
  b->BFunc();
}
else if ( dynamic_cast <A*>(p) ) {
  A * a = dynamic_cast <A*>(p);
  a->AFunc();
}

其中AFunc,BFunc,CFunc特定于其各自的类,而不是虚拟的。显然,这可以在某种程度上进行优化。