gpt4 book ai didi

c++ dynamic_cast 错误处理

转载 作者:IT老高 更新时间:2023-10-28 13:02:51 27 4
gpt4 key购买 nike

是否有任何与 dynamic_cast 错误处理相关的良好做法(除非在不必要时不使用它)?我想知道我应该如何处理它可以抛出的 NULL 和 bad_cast 。我应该检查两者吗?如果我捕捉到 bad_cast 或检测到 NULL,我可能无论如何都无法恢复......现在,我使用 assert 来检查 dynamic_cast 是否返回非 NULL 值。你会在代码审查时接受这个解决方案吗?

最佳答案

如果 dynamic_cast 应该 成功,最好使用 boost::polymorphic_downcast 代替,这有点像这样:

assert(dynamic_cast<T*>(o) == static_cast<T*>(o));
return static_cast<T*>(o);

这样,您将在调试构建中检测错误,同时避免发布构建中的运行时开销。

如果您怀疑转换可能失败并且您想检测它,请使用 dynamic_cast 并转换为引用类型。如果出现错误,此转换将抛出 bad_cast,并将取消您的程序。 (如果正如你所说,你无论如何都不会恢复,这很好)

T& t = dynamic_cast<T&>(o);
t.func(); //< Use t here, no extra check required

仅当 0 指针在上下文中有意义时,才将 dynamic_cast 用于指针类型。您可能希望像这样在 if 中使用它:

if (T* t = dynamic_cast<T*>(o)) {
t->func(); //< Use t here, it is valid
}
// consider having an else-clause

使用最后一个选项,如果 dynamic_cast 返回 0,您需要确保执行路径有意义。

直接回答您的问题:我更喜欢我给出的两个第一个替代方案之一,而不是在代码中明确 assert :)

关于c++ dynamic_cast 错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/246293/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com