2016-02-03 144 views
0

我处理,我不能直接使用dynamic_cast因为对象是void*一个特例。使用它第一static_cast然后dynamic_cast(在static_cast的结果)是不好的做法?这是错的吗?使用的static_cast然后dynamic_cast的

这里就是我谈论的例子:

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); 
} 
+3

'pTemp'已经是'MyClass *',你期望'dynamic_cast'在这里做什么?你的评论没有意义 - 如果'pVoidPtr'是一个nullptr,那么'pTemp'也是,所以你仍然可以返回它。 – Barry

+0

如果'pVoidPtr'不是'MyClass'类型,'pTemp'不会是非null? –

+0

原创评论:只是为了提高@巴里的评论:'回报的dynamic_cast (pVoidPtr);'应该做的工作。查看答案以获取更多详细信息。编辑评论:哦,我不知道这是不可能的。忘记我的评论。 –

回答

3

这将取决于指针是怎么成为一个void*开始。如果它是从同类型强制转换为void*作为强制转换(这里MyClass*),然后是,这个转换是罚款和按预期工作;

cppreference on static_cast

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

以这种方式使用static_cast本质上是说编译器“我知道这是这种类型 - 相信我”,并且编译器有责任。

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


目前的情况是,该功能可以简化为:

MyClass* CastVoidPtr(void* pVoidPtr) 
{ 
    return static_cast<MyClass*>(pVoidPtr); 
} 

或者简单地用一个裸体static_cast<>


附注;这里值得一提的是完整性是reinterpret_cast has similar functionality;

任何指针T1类型的到对象可被转换为指针的另一类型的cv T2到对象。这是完全等效于static_cast<cv T2*>(static_cast<cv void*>(expression))(这意味着如果T2的对准要求不严格大于T1的,指针的值不改变,并且所产生的指针转换回其原始类型产生的原始值)。在任何情况下,只有在类型别名规则允许的情况下,才能安全地解除引用的指针...