Alexandrescus умный отстаивать с возвращаемым значением - PullRequest
2 голосов
/ 01 апреля 2011

Я использую технику умного утверждения Андрея Александрескуса для своего объекта утверждения, в основном интерфейс:

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, конструкторов или деструкторов.

1 Ответ

0 голосов
/ 01 апреля 2011

Хотя и не совсем удовлетворительно, я выкладываю это на всякий случай, если это может быть подсказка для вас:

#define ASSERT3( expr, msg, ret, ... )                                  \
    if( (expr) );                                                       \
    else {                                                              \
        MakeAssert().AddContext(....).SMART_ASSERT_A __VA_ARGS__;       \
        return ret;                                                     \
    }

ASSERT3( foo == bar, "...", 0, ( foo )( bar ) ) // usage
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...