在某些编译器环境中禁用RTTI的情况下,我想知道这一点。
用例:
我在代码中使用了它,并在我的机器上工作了,但是在集成测试期间,代码无法正常运行,甚至崩溃了。
我猜想如果RTTI不存在,它将返回null,这在我的代码中已经处理过,但是行为是意外的。
我应该检查些什么才能优雅地终止它?
此外,当我使用dynamic_cast的包装程序(在我们的内部框架中定义)时,它的工作正常。包装程序必须满足哪种要求?
答案 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);
}