安全地检查变量的类型

2023-11-30

对于系统,我需要将指针转换为 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(使用前将#替换为@)

安全地检查变量的类型 的相关文章

随机推荐