Я написал функцию:
template<int N> void tryHarder() {
for(int i = 0; i < N; i++) {
tryOnce();
}
}
но я хочу, чтобы он компилировался, только если N находится в диапазоне от 0 до 10. Могу ли я это сделать? Как?
Вы можете сделать это с 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
}
Для компиляторов до C ++ 11 вы могли бы реализовать ограничение параметра шаблона для нетипичного параметра N.
Описание того, как это сделать, см. http://stroustrup.com/bs_faq2.html#constraints
В сочетании с ответами, данными до сих пор, нижняя граница также может быть покрыта с помощью unsigned int
как тип шаблона. Отрицательные значения, если они применяются, будут преобразованы в значения без знака, достаточно высокие, чтобы они были покрыты static_assert
или решение до C ++ 11 в любом случае.
unsigned int
дополнительно уже семантически дает подсказку, что отрицательные значения не должны применяться к этому шаблону, поэтому его (возможно) следует отдать предпочтение в конкретном случае …
#if !defined(__cplusplus)
#error C++ compiler required.
#endif
Это всего лишь пример.
Вот ссылка на источник: http://msdn.microsoft.com/en-us/library/c8tk0xsk(v=vs.71).aspx
Все, что я говорю, это то, что вы также можете использовать #error
Это директива
Edit @Pratik Chowdhruy: я согласен с Полом Р. Это не дает прямого ответа на вопрос. Извините перед сообществом