суббота, 12 мая 2012 г.

STATIC_ASSERT

Нашел в книге Андрея Алексендреску "Современное проектирование на C++" следующий простой и красивый способ реализации статической проверки условий:
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


Комментариев нет:

Отправить комментарий