对于一个系统,我需要将指针转换为 long 然后将 long 转换回指针类型。你可以猜到这是非常不安全的。我想做的是使用 dynamic_cast 进行转换,所以如果我混合它们,我会得到一个空指针。这个页面说http://publib.boulder.ibm.com/infocenter/lnxpcomp/v7v91/index.jsp?topic=/com.ibm.vacpp7l.doc/language/ref/clrc05keyword_dynamic_cast.htm
dynamic_cast 运算符在运行时执行类型转换。dynamic_cast 运算符保证将指向基类的指针转换为指向派生类的指针,或将引用基类的左值转换为对派生类的引用。因此,程序可以安全地使用类层次结构。此运算符和 typeid 运算符在 C++ 中提供运行时类型信息 (RTTI) 支持。
如果它为空,我想得到一个错误,所以我编写了自己的动态演员表
template<class T, class T2> T mydynamic_cast(T2 p)
{
assert(dynamic_cast<T>(p));
return reinterpret_cast<T>(p);
}
使用 MSVC,我收到错误“错误 C2681:'long':dynamic_cast 的无效表达式类型”。事实证明,这只适用于具有虚函数的类...... WTF!我知道动态转换的重点是针对向上/向下转换继承问题,但我也认为它是为了动态解决类型转换问题。我知道我可以使用 reinterpret_cast 但这并不能保证相同类型的安全性。
我应该用什么来检查我的类型转换是否是同一类型?我可以比较这两个 typeid,但是当我想将派生的类型转换为它的基时会遇到问题。那么我该如何解决呢?