Добрый день, обратил внимание, что во многих проектах я использую следующий макрос для проверки корректности параметров функций:
#define APP_THROW_INVALID_ARGUMENT_IF_FAIL(expression) \
do { \
using std::invalid_argument; \
using std::string; \
\
if(!(expression)) \
throw invalid_argument(string(BOOST_CURRENT_FUNCTION) + \
" : Условие '" #expression "' ложно"); \
} while(false)
Вместо APP в имени макроса подставляю название проекта (обычно — это библиотеки) — чтобы не было конфликтов имен. Макрос используется так:
void setSize(int width, int height)
{
APP_THROW_INVALID_ARGUMENT_IF_FAIL(width >= 0);
APP_THROW_INVALID_ARGUMENT_IF_FAIL(height >= 0);
// ...
}
Как видите, все достаточно просто. Однако есть ряд вопросов:
Некоторые говорят, что макросы — зло. Интересно, как получить ту же функциональность без макросов?
Альтернативные варианты названия для подобного макроса. Очень уж длинно писать. Думал про APP_ASSERT, но, на мой взгляд, такое название вносит путаницу — assert приводит к завершению программы, а тут генерируется исключение.
Другие варианты решения поставленной задачи (напомню, нужно проверить аргумент(ы) функции на корректность и сгенерировать исключение в случае, если не все в порядке).