#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’ — это просто тип, который отображается в ошибке, но я нахожу его более удобным, чем практически любой другой механизм статического утверждения.