2015-12-02 6 views
0

Я фильтрую кортеж во время компиляции, я хочу вывести собственное сообщение об ошибке, если кортеж пуст или если кортеж содержит более одного элемента.Несколько static_assert, которые зависят от того же значения

static_assert кажется слишком сложным, потому что мне нужно использовать логическую логику.

static_assert(size != 0 || size >= 1, "Empty"); 
static_assert(size == 1 || size == 0, "More than 1"); 

Я не думаю, что что-то подобное возможно?

static_if(size == 0) compile_err("Empty"); 
static_if(size > 1) compile_err("More than 1"); 

Нужна ли более новая версия C++ альтернативой static_assert?

+1

Зачем вам нужна более сложная логика с помощью 'static_assert'? Реверсирование двух условий static_if должно работать одинаково. В первом 'static_assert' у вас есть, если предположить тип unsigned,' size ≠ 0 ⇔ size ≥ 1', поэтому один из них является избыточным. – chris

+5

'static_assert (size! = 0,« Не должно быть пустым »)' и 'static_assert (размер <= 1,« Слишком много »)' кажутся тем, что вы хотите. –

+0

@MatsPetersson Вы правы, я не уверен, почему я не написал его, как вы. Я думаю, я, должно быть, был смущен тем, что 'false' запускает assert, а не' true'. –

ответ

1

static_assert допускает логическую логику. То, что он не позволяет, вызывает функции (не constexpr). Поэтому нет причин, по которым вы не можете использовать эту логику в своем коде.

static_assert(sizeof(Args...) != 0, "Empty"); 
static_assert(sizeof(Args...) < 2, "More than 1"); 
+0

Похоже, я был просто сбит с толку, но вам нужно свести на нет ваши два выражения, прежде чем я смогу принять ответ, потому что 'static_assert' срабатывает при' false'. –

+0

@MaikKlein: Готово. –

Смежные вопросы