Нашел в книге Андрея Алексендреску "Современное проектирование на C++" следующий простой и красивый способ реализации статической проверки условий:
Пример использования:
Компилятор при этом выдает следующее сообщение об ошибке:
Интересно, что BOOST_STATIC_ASSERT (как и BOOST_STATIC_ASSERT_MSG) выдает в абсолютно такой же ситуации значительно менее информативное сообщение:
namespace Loki {
template<int> struct CompileTimeError;
template<> struct CompileTimeError<true> {};
} // namespace Loki
#define STATIC_ASSERT(expr, msg) \
{ ::Loki::CompileTimeError<((expr) != 0)> ERROR_##msg; (void)ERROR_##msg; }
Пример использования:
STATIC_ASSERT(5 == 7, INCORRECT_STATEMENT);
Компилятор при этом выдает следующее сообщение об ошибке:
error: aggregate ‘Loki::CompileTimeError<0> ERROR_INCORRECT_STATEMENT’ has incomplete type and cannot be defined
Интересно, что BOOST_STATIC_ASSERT (как и BOOST_STATIC_ASSERT_MSG) выдает в абсолютно такой же ситуации значительно менее информативное сообщение:
error: invalid application of ‘sizeof’ to incomplete type ‘boost::STATIC_ASSERTION_FAILURE’
Комментариев нет:
Отправить комментарий