templates — [утверждения времени компиляции C ++]: можем ли мы выдать ошибку компиляции, если какое-то условие не выполнено?

Я написал функцию:

template<int N> void tryHarder() {
for(int i = 0; i < N; i++) {
tryOnce();
}
}

но я хочу, чтобы он компилировался, только если N находится в диапазоне от 0 до 10. Могу ли я это сделать? Как?

7

Решение

Вы можете сделать это с static_assert декларация:

template<int N> void tryHarder() {

static_assert(N >= 0 && N <= 10, "N out of bounds!");

for(int i = 0; i < N; i++) {
tryOnce();
}
}

Эта функция доступна только с C ++ 11. Если вы застряли с C ++ 03, взгляните на Статический макрос утверждения Boost.

Вся идея этого — хорошие сообщения об ошибках. Если вы не заботитесь об этом или не можете даже дать импульс, вы можете сделать следующее:

template<bool B>
struct assert_impl {
static const int value = 1;
};

template<>
struct assert_impl<false> {
static const int value = -1;
};

template<bool B>
struct assert {
// this will attempt to declare an array of negative
// size if template parameter evaluates to false
static char arr[assert_impl<B>::value];
};

template<int N>
void tryHarder()
{
assert< N <= 10 >();
}

int main()
{
tryHarder<5>();  // fine
tryHarder<15>();  // error, size of array is negative
}
14

Другие решения

Для компиляторов до C ++ 11 вы могли бы реализовать ограничение параметра шаблона для нетипичного параметра N.

Описание того, как это сделать, см. http://stroustrup.com/bs_faq2.html#constraints

1

В сочетании с ответами, данными до сих пор, нижняя граница также может быть покрыта с помощью unsigned int как тип шаблона. Отрицательные значения, если они применяются, будут преобразованы в значения без знака, достаточно высокие, чтобы они были покрыты static_assert или решение до C ++ 11 в любом случае.

unsigned int дополнительно уже семантически дает подсказку, что отрицательные значения не должны применяться к этому шаблону, поэтому его (возможно) следует отдать предпочтение в конкретном случае …

0

#if !defined(__cplusplus)
#error C++ compiler required.
#endif

Это всего лишь пример.

Вот ссылка на источник: http://msdn.microsoft.com/en-us/library/c8tk0xsk(v=vs.71).aspx

Все, что я говорю, это то, что вы также можете использовать #error

Это директива

Edit @Pratik Chowdhruy: я согласен с Полом Р. Это не дает прямого ответа на вопрос. Извините перед сообществом

-2
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector