首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用static_cast,然后使用dynamic_cast

使用static_cast,然后使用dynamic_cast
EN

Stack Overflow用户
提问于 2016-02-03 13:07:50
回答 1查看 237关注 0票数 0

我正在处理一种特殊情况,在这种情况下,我不能直接使用dynamic_cast,因为对象是void*。是否对其使用了第一个static_cast,然后使用了dynamic_cast (根据static_cast的结果)?这样做不对吗?

下面是我要说的一个例子:

代码语言:javascript
复制
MyClass* CastVoidPtr(void* pVoidPtr)
{
    // casting it to MyClass so we could use dynamic_cast
    MyClass* pTemp = static_cast<MyClass*>(pVoidPtr);

    // returning the actual result that will make sure that we have a MyClass object or a nullptr
    return dynamic_cast<MyClass*>(pTemp);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-03 13:14:12

这将取决于指针是如何开始成为void*的。如果它是从与被转换为(这里的void* )相同的类型转换到MyClass*的,那么是的,这个转换是很好的,并且按预期工作;

来自static_cast

指向void的类型指针(可能是cv限定的)的prvalue可以转换为指向任何类型的指针。如果原始指针的值满足目标类型的对齐要求,则结果指针值不变,否则未指定。将任何指针转换为指针到void并返回到指向原始(或更多cv限定)类型的指针将保留其原始值。

以这种方式使用static_cast,本质上就是对编译器说“我知道它是这种类型--请相信我”,而编译器很乐意这样做。

然后可以在此之后对dynamic_cast进行评估。它通常用于转换为更派生的类型。在这里,您正在转换为相同的类型-它并没有做任何特别有用的事情。如果该类型是一个更派生的类型(例如MySpecialisedClass),那么就可以了。

就目前情况而言,该功能可简化为:

代码语言:javascript
复制
MyClass* CastVoidPtr(void* pVoidPtr)
{
    return static_cast<MyClass*>(pVoidPtr);
}

或者简单地使用裸露的static_cast<>

值得注意的是,为了完整性起见,这里值得一提的是 has similar functionality

指向T1类型对象的任何指针都可以转换为指向另一类型cv T2的对象的指针。这完全等同于static_cast<cv T2*>(static_cast<cv void*>(expression)) (这意味着,如果T2的对齐要求不比T1的更严格,指针的值不会改变,并且将结果指针转换回其原始类型将产生原始值)。

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

https://stackoverflow.com/questions/35177969

复制
相关文章

相似问题

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