добавление строкового литерала в static_assert

#c #static-assert

#c #статическое утверждение

Вопрос:

Есть ли способ объединить то, что будет выводиться static_assert? Я имею в виду следующее:

 template<class T>
struct X
{
static_assert(std::is_signed<T>::value, "Type "   T   " must be signed.");//this doesn't work
};
  

Ответ №1:

На том основании, что это не компилируется

 int main()
{
   const char c[2] = "1";
   static_assert(1==1, c)
}
  

ни это

 int main()
{
   const char* c = "1";
   static_assert(1==1, c)
}
  

Оба с ошибками error: expected a string literal тогда мне пришлось бы сделать вывод, что это невозможно.

«Строковый литерал состоит из нуля или более символов из исходного набора символов, заключенных в двойные кавычки («). Строковый литерал представляет последовательность символов, которые, взятые вместе, образуют строку, заканчивающуюся нулем.» — Строковые литералы C

Возможно, вы захотите рассмотреть возможность использования Boost::StaticAssert , поскольку это может дать вам то, что вы ищете.

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

1. Да, но это выдает значимые сообщения об ошибке, поэтому выводит тип в строке сбоя утверждения.

2. IMO, boost static_assert не выдает более значимых сообщений. Оба указывают вам на строку, но один говорит что-то вроде: «При создании экземпляра ‘X<unsigned int>’ … ошибка: ошибка статического утверждения: «Тип должен быть подписан». . А другой говорит что-то вроде: «… ошибка: недопустимое применение ‘sizeof’ к неполному типу ‘boost::STATIC_ASSERTION_FAILURE<false>'»

3. @UncleBens согласен. Boost — это не правильный путь (в данном случае).

4. @Там вы могли бы попробовать использовать BOOST_MPL_ASSERT_MSG. Верно, ‘message’ — это просто тип, который отображается в ошибке, но я нахожу его более удобным, чем практически любой другой механизм статического утверждения.