Я использую технику умного утверждения Андрея Александрескуса для своего объекта утверждения, в основном интерфейс:
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
, это работает хорошо, но вот кикер и проблема, с которой я сейчас сталкиваюсь:Метод нельзя использовать ни для функций, которые возвращают void
, конструкторов или деструкторов.