首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取变量的类型

问获取变量的类型
EN

Stack Overflow用户
提问于 2010-01-01 06:04:18
回答 2查看 6.9K关注 0票数 5

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

它们的返回是否也用于不同的目的: typeof的返回用作可以定义变量的type关键字,而typeid的返回则不能?

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

代码语言:javascript
复制
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

非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-01-01 06:07:14

c++0x将拥有decltype,它可以像这样使用:

代码语言:javascript
复制
int someInt;
decltype(someInt) otherIntegerVariable = 5;

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

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

代码语言:javascript
复制
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
    }
}
票数 7
EN

Stack Overflow用户

发布于 2010-01-01 06:44:13

假设层次结构A <- B <- C

代码语言:javascript
复制
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特定于它们各自的类,而不是虚拟的。显然,这在某种程度上是可以优化的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1987286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档