考虑下面的代码摘录:
typedef struct tagTHREADNAME_INFO {
DWORD dwType;
LPCTSTR szName;
DWORD dwThreadID;
DWORD dwFlags;
} THREADNAME_INFO;
const THREADNAME_INFO info = { 0x1000, threadName, CurrentId(), 0};
::RaiseException(kVCThreadNameException, 0,
sizeof(info) / sizeof(ULONG_PTR),
(ULONG_PTR*)&info);
如何使用C ++样式转换正确地转换为ULONG_PTR *?
P.S。它是依赖于平台的代码。
答案 0 :(得分:7)
我想这将是const_cast<ULONG_PTR*>(reinterpret_cast<const ULONG_PTR*>(&info))
。
从Effective C ++,第3版。 Ed。,Item 27:
const_cast
通常用于抛弃对象的常量。它是唯一能够做到这一点的C ++风格的演员。reinterpret_cast
用于产生依赖于实现的(即,不可移植的)结果的低级转换,例如,转换指向int的指针。在低级代码之外,此类强制转换应该很少见。
为了完整起见,剩下的两个C ++演员阵容是:
dynamic_cast
主要用于执行“安全向下转换”,即确定对象是否属于继承层次结构中的特定类型。它是唯一使用旧式语法无法执行的强制转换。它也是唯一可能具有显着运行时成本的演员。static_cast
可用于强制隐式转换(例如,非const
对象到const
对象(如第3项),int
到{{1}等等)。它也可用于执行许多此类转换的反转(例如,double
指向类型指针的指针,指向指针到指向的指针,尽管它不能从void*
转换为非const
个对象。 (只有const
可以做到这一点。)