我想知道在某些编译器环境中禁用 RTTI 的情况。
用例:
我在我的代码中使用了它并且它在我的机器上运行但在集成测试期间代码无法正常运行,而是崩溃了。
我认为如果 RTTI 不存在,它会返回 null,这在我的代码中已处理,但行为是意外的。
我应该检查什么才能优雅地终止它?
此外,当我使用 dynamic_cast 的包装器(在我们的内部框架中定义)时,它工作正常。该包装器必须采用哪种实现方式才能满足此要求?
最佳答案
陈百强留下精彩link在关于如何检测 RTTI 是否启用的评论中。
要完成此操作,您可以使用以下方法覆盖 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);
}
关于c++ - 在 C++ 中是否有替代 dynamic_cast 的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58547025/