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

    上一篇: C++ When should we prefer to use a two chained static

    下一篇: Which one to use when static