Шаблон C ++: Как поместить нетипичные ограничения во время компиляции - PullRequest
5 голосов
/ 03 марта 2012

Предположим, у меня есть следующий шаблон

template<unsigned char I, unsigned char F>
class FOO
{
   ....
}

На самом деле, я требую (I> = F).Если кто-то неправильно использует

FOO<1, 2> a;

, я надеюсь вызвать ошибку компиляции.Как это сделать?

Спасибо

Ответы [ 2 ]

8 голосов
/ 03 марта 2012

Одним из способов может быть C ++ 11 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");
    ...
};
6 голосов
/ 03 марта 2012

Если у вас нет 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...