如何在具有类型安全的 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,但您必须自己添加任何诊断信息。