我使用Andrei Alexandrescus智能断言技术作为我的断言设施,基本上接口是:
ASSERT( foo == bar, "Foo doesn't equal bar!" )( foo )( bar );
事实证明,通常当断言不成立时,想要提前退出,这导致我发生以下过载:
ASSERT( foo == bar, "Foo doesn't equal bar!", 0 )( foo )( bar )
遗憾的是,这个基于的递归宏技巧的一个限制是宏必须以另一个宏结束,它将所有内容都转换为齿轮,这导致我使用以下代码来支持返回值:
#define ASSERT3( expr, msg, ret ) \
if( (expr) ); \
else \
return ret + MakeAssert().AddContext( #expr, msg, BOOST_CURRENT_FUNCTION, __FILE__, __LINE__ ).SMART_ASSERT_A
通过为operator+()
类重载Assert
,这很好用,但这是我目前面临的问题和解决方法:此方法不能用于返回{{1 ,构造函数或析构函数。
答案 0 :(得分:0)
虽然不是很令人满意,但我发布这个以防这可能是一个暗示 为你:
#define ASSERT3( expr, msg, ret, ... ) \
if( (expr) ); \
else { \
MakeAssert().AddContext(....).SMART_ASSERT_A __VA_ARGS__; \
return ret; \
}
ASSERT3( foo == bar, "...", 0, ( foo )( bar ) ) // usage