在c++中有dynamic_cast的替代方案吗

Is there any alternative to dynamic_cast in c++?

本文关键字:方案 cast c++ 中有 dynamic      更新时间:2023-10-16

如果RTTI在某些编译器环境中被禁用,我想知道这一点。

用例:

我在代码中使用了它,它在我的机器上运行,但在集成测试期间,代码未能正常运行,而是崩溃了。

我以为它会返回null,以防我的代码中处理的RTTI不在那里,但行为出乎意料。

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

此外,当我使用dynamic_cast的包装器(在我们的内部框架中定义(时,它工作得很好。包装器需要什么样的实现才能满足这个要求?

Raymond Chen在评论中留下了一个关于如何检测是否启用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);
}