对于系统,我需要将指针转换为 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 运算符保证
指针到基数的转换
类到派生类的指针,
或左值的转换
将基类引用到
对派生类的引用。 A
因此程序可以使用一个类
安全的层次结构。该运算符和
typeid 运算符提供运行时
类型信息 (RTTI) 支持
C++。
如果它为空,我想得到一个错误,所以我编写了自己的动态转换
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,但是当我想将派生类型转换为其基类时,我会遇到问题。那么我该如何解决这个问题呢?
dynamic_cast
只能在通过继承相关的类之间使用。要将指针转换为 long 或反之亦然,您可以使用reinterpret_cast
。要检查指针是否为空,您可以assert(ptr != 0)
。但是,通常不建议使用reinterpret_cast
。为什么需要将指针转换为long?
另一种选择是使用联合:
union U {
int* i_ptr_;
long l;
}
同样,联盟也只是很少需要。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)