Using static_cast and then dynamic_cast
Using static_cast and then dynamic_cast
我正在处理一种特殊情况,我不能直接使用dynamic_cast
,因为对象是void*
。先使用static_cast
,然后再dynamic_cast
(根据static_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);
}
这取决于指针如何开始成为void*
。如果它从与投射到(此处MyClass*
相同的类型转换为void*
,那么是的,此强制转换很好并且按预期工作;
从 cpp 首选项上static_cast
:
指向
void
的指针类型的 prvalue(可能符合 cv 条件(可以转换为指向任何类型的指针。如果原始指针的值满足目标类型的对齐要求,则生成的指针值保持不变,否则未指定。将任何指针转换为指向void
的指针,然后再转换回指向原始(或更符合 cv 条件(类型的指针,将保留其原始值。
以这种方式使用static_cast
本质上是对编译器说"我知道它是这种类型 - 相信我",编译器有义务。
然后可以在此之后评估dynamic_cast
。它通常用于强制转换为派生程度更高的类型。在这里,您正在转换为相同的类型 - 它没有做任何特别有用的事情。如果类型是派生类型(例如 MySpecialisedClass
(,那就没问题了。
就目前而言,该功能可以简化为:
MyClass* CastVoidPtr(void* pVoidPtr)
{
return static_cast<MyClass*>(pVoidPtr);
}
或者简单地使用裸static_cast<>
.
旁注; 为了完整性,这里值得一提的是reinterpret_cast
具有类似的功能;
任何指向
T1
类型的对象的指针都可以转换为指向另一种类型对象的指针cv T2
。这完全等同于static_cast<cv T2*>(static_cast<cv void*>(expression))
(这意味着如果T2
的对齐要求不比T1
的对齐要求更严格,则指针的值不会更改,并且将生成的指针转换回其原始类型会产生原始值(。在任何情况下,只有在类型别名规则允许的情况下,才能安全地取消引用生成的指针...
- 如何理解C++标准N3337中的expr.const.cast子句8
- C++Cast运算符过载
- 在成员dynamic_bitset上使用 boost::from_block_range 时出错,但在本地dynamic
- C++类中的二维"dynamic"数组?
- 错误:"cast"未命名类型void setCastDescription(std::string
- 通过使用 const-cast 的非常量引用来延长临时的寿命
- "(void) cast"与功能有什么区别 "__attributes__"来沉默未使用的参数警告?
- protobuf in C++ with dynamic binding for google::protobuf::M
- 警告的原因是什么:"when type is in parentheses, array cannot have dynamic size"?
- C++:"Expected '(' for function-style cast or type construction"错误
- 为什么选择 g++ 给予者:"error: cast to pointer from integer of different size [-Werror=int-to-pointer-cast]"
- CUDA 错误:"dynamic initialization is not supported for __device__, __constant__ and __shared__ variabl
- Gtk+ g_signal_connect() 和 C++ lambda 会导致"invalid cast"错误
- 如何修复'The procedure entry point SDL_RWclose could not be located in the dynamic link library'
- Shared_ptr cast vs static_cast speed
- 在 iOS 上使用 Aruco 构建 OpenCV 时"Functional-style cast from id to double is not allowed"
- "The ordinal 344 could not be located in the dynamic link library"
- 覆盖 CAST 运算符(我认为它被称为向下转换)
- Dynamic Cast C++ Fail
- dynamic-cast-c++dynamic_cast错误处理