在C ++中,除了dynamic_cast之外,还有其他选择吗?

时间:2019-10-24 18:13:13

标签: c++ inheritance downcast

在某些编译器环境中禁用RTTI的情况下,我想知道这一点。

用例:

我在代码中使用了它,并在我的机器上工作了,但是在集成测试期间,代码无法正常运行,甚至崩溃了。

我猜想如果RTTI不存在,它将返回null,这在我的代码中已经处理过,但是行为是意外的。

我应该检查些什么才能优雅地终止它?

此外,当我使用dynamic_cast的包装程序(在我们的内部框架中定义)时,它的工作正常。包装程序必须满足哪种要求?

1 个答案:

答案 0 :(得分:0)

Raymond Chen在关于如何检测RTTI是否已启用的评论中留下了神话般的link

要完成此操作,可以使用以下命令覆盖dynamic_cast

#if !defined(RTTI_ENABLED)
    #define dynamic_cast _NullPtrTFn
#endif

template <typename T1, typename T2>
T1* _NullPtrTFn(T2* p)
{
    static_cast<T1*>(p); // try fail to compile (https://godbolt.org/z/hcjKki)
    return static_cast<T1*>(nullptr);
}