如何在具有类型安全的 C++ 11/14 中实现没有宏的运行时调试断言?
How to implement a runtime debug assertion without macros in C++ 11/14 with type safety?
要在以下上下文中使用的断言:
ASSERT(dynamic_cast<Derived*>(_ptr));
ptr = static_cast<Derived*>(ptr);
因此在调试期间,断言将检查动态转换,但将在发布模式下被删除。 (标准断言行为)
我如何在没有宏的情况下实现这一点。我当时的想法是:
void ASSERT(bool _arg)
{
if(!_arg)
//something
}
但是,这并不能确保类型安全。此外,我正在考虑对此进行两种实现,一种是空的(用于发布,因此 ASSERT 函数不执行任何操作),另一种带有上面的代码用于调试。此方法还依赖于编译器优化空函数,这并不总是可靠的。
因此,最好的解决方法是什么?或者宏是绝对必要的...?
如您所说,为此目的使用宏相对于函数的好处是,检查可能不会完全优化,您仍需支付 dynamic_cast。
您最好的选择是使用 assert(dynamic_cast<Derived*>(_ptr) != nullptr)
。类型安全不会为 assert-like 行为买任何东西。
如果您必须编写自己的函数,可以有条件地从 <cstdlib>
header 调用 std::abort
,但您必须自己添加任何诊断信息。
要在以下上下文中使用的断言:
ASSERT(dynamic_cast<Derived*>(_ptr));
ptr = static_cast<Derived*>(ptr);
因此在调试期间,断言将检查动态转换,但将在发布模式下被删除。 (标准断言行为)
我如何在没有宏的情况下实现这一点。我当时的想法是:
void ASSERT(bool _arg)
{
if(!_arg)
//something
}
但是,这并不能确保类型安全。此外,我正在考虑对此进行两种实现,一种是空的(用于发布,因此 ASSERT 函数不执行任何操作),另一种带有上面的代码用于调试。此方法还依赖于编译器优化空函数,这并不总是可靠的。
因此,最好的解决方法是什么?或者宏是绝对必要的...?
如您所说,为此目的使用宏相对于函数的好处是,检查可能不会完全优化,您仍需支付 dynamic_cast。
您最好的选择是使用 assert(dynamic_cast<Derived*>(_ptr) != nullptr)
。类型安全不会为 assert-like 行为买任何东西。
如果您必须编写自己的函数,可以有条件地从 <cstdlib>
header 调用 std::abort
,但您必须自己添加任何诊断信息。