Предположим, у меня есть следующий шаблон
template<unsigned char I, unsigned char F> class FOO { .... }
На самом деле, я требую (I> = F).Если кто-то неправильно использует
FOO<1, 2> a;
, я надеюсь вызвать ошибку компиляции.Как это сделать?
Спасибо
Одним из способов может быть C ++ 11 static_assert, который похож на assert, но проверяется во время компиляции:
static_assert
assert
template<unsigned char I, unsigned char F> class FOO { static_assert(I >= F, "I needs to be larger or equal to F"); ... };
Если у вас нет C ++ 11, здесь работает старый добрый трюк с ограничениями массива.Просто поместите следующее в приватную секцию вашего класса:
static int const error_size = I >= F ? 1 : -1; typedef char ERROR_I_must_not_be_less_than_F[error_size];
Это вызовет ошибку «отрицательного размера массива» всякий раз, когда I меньше F.
I
F