在如下上下文中使用的断言:
ASSERT(dynamic_cast<Derived*>(_ptr));
ptr = static_cast<Derived*>(ptr);
因此,在调试过程中,断言将检查动态转换,但在 Release模式下将被删除。 (标准断言行为)
如何在不使用宏的情况下实现此功能。我的想法是:
void ASSERT(bool _arg)
{
if(!_arg)
//something
}
但是,这并不能确保类型安全。此外,我正在考虑对此有两种实现,一种是空的(用于发布,因此 ASSERT 函数不执行任何操作),另一种是使用上面的代码进行调试。此方法还依赖于编译器优化空函数,这并不总是可靠的。
因此,最好的方法是什么?或者宏是绝对必要的......?
最佳答案
为此目的使用宏相对于函数的好处正如您所说,检查有可能不会完全优化,并且您仍然需要为dynamic_cast付费。
您最好的选择是使用assert(dynamic_cast<Derived*>(_ptr) != nullptr)
。类型安全不会为您带来任何类似于断言的行为。
如果一定要自己写函数,可以有条件调用std::abort
来自<cstdlib>
header ,但您必须自己添加任何诊断信息。
关于c++ - 如何在 C++ 11/14 中实现类型安全且无需宏的运行时调试断言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30233733/