C ++何时应该更喜欢使用两个链式静态
首先,这不是重复的为什么当两个链接的static_cast可以完成它的工作时,我们在C ++中使用reinterpret_cast ?.
我知道甚至不能使用两个链接的static_cast
来实现这一点, reinterpret_cast
做什么。 但是有没有什么情况下我应该更喜欢两个链接的static_cast
不是一个简单且更易读的reinterpret_cast
?
reinterpret_cast
应该是一个巨大的闪烁符号,说这个疯狂的疯狂,但我知道我在做什么。 不要仅仅因为懒惰而使用它。
reinterpret_cast
意思是“将这些位视为...”链式静态转换不相同,因为它们可以根据继承格来修改它们的目标。
struct A {
int x;
};
struct B {
int y;
};
struct C : A, B {
int z;
};
C c;
A * a = &c;
int main () {
assert (reinterpret_cast <B *> (a) != static_cast <B *> (static_cast <C *> (a)));
}
如果您不是100%确定指向b
a
点,请使用dynamic_cast
来搜索上述解决方案(尽管运行成本)。 请记住,这可能会返回NULL或发生故障。
当我真正使用reinterpret_cast
,我试图想到时间,实际上只有两个:
const char *
来遍历它 if(*reinterpret_cast<uint32_t*>(array_of_4_bytes_A) < *reinterpret_cast<uint32_t*>(array_of_4_bytes_B)
或其他类似的行邀请审查和需求评论。 否则,如果你有一个真正是B*
的A*
,那么你可能需要一个联合。
我宁愿reinterpret_cast <TargetType> (pointer_of_some_other_type)
看到reinterpret_cast <TargetType> (pointer_of_some_other_type)
不是static_cast <TargetType> (static_cast <void*> (pointer_of_some_other_type))
或static_cast <TargetType> ((void*) (pointer_of_some_other_type))
。 那些通过无效*的演员阵容只是一种狡猾的,毫无道理的方式来避免使用可怕的reinterpret_cast。
许多项目禁止使用reinterpret_cast,除非获得豁免; 编写代码的人需要证明演员的使用是合理的。 国际海事组织,一连串的静态演员比reinterpret_cast 更糟 (更糟!)。 链具有相同的效果,与reinterpret_cast相同的问题,但该链不具有易于使用grep查找的好处。
附录
这样看。 案例1中,您使用reinterpret_cast,您将通过所有项目环境来证明其用途,项目经理授予豁免权。 几个月后,您使用dynamic_cast时会出现错误。 你有一个摆脱监狱免费卡。 这是项目经理的屁股,是为了给你那张卡。
案例2中,您使用了一些鬼鬼祟祟的,不合格的静态转换链,并且代码无懈可击地通过同行评议。 几个月后,一个错误是追溯到您使用卑鄙的技术。 你的项目经理可能会因为没有捕捉到这种恶心而遇到麻烦,但这是你的屁股。 你没有那个摆脱监狱免费卡。 你不通过Go。 你直接去失业线。
总是使用重新解释演员作为最后的手段 - 它不做任何检查! - 所以如果你可以将两个,三个或十个语句连在一起,对操作进行某种验证,那么你已经获得了一些有价值的东西。
链接地址: http://www.djcxy.com/p/28749.html