2013-04-24 2 views
6

Я написал функцию:[Сроки выполнения компиляции C++]: Можно ли выполнить ошибку компиляции, если какое-либо условие не выполняется?

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

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

+6

Посмотрите на [static_assert] (http://en.cppreference.com/w/cpp/language/static_assert) – juanchopanza

+0

@juanchopanza: Это ответ. – Nawaz

+0

Отлично! Но есть ли что-нибудь pre-C++ 11? – MciprianM

ответ

13

Вы можете сделать это с static_assert declaration:

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's static assert macro.

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

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 
} 
+0

Это предполагает, что 'N' является константой времени компиляции, tho '. –

+1

Сделано немного проще, если вы измените его на 'template void tryHader() {static_assert (N <= 10,« N вне границ! »);' – Yakk

+4

@MatsPetersson как аргумент шаблона, кажется безопасное предположение - это постоянная времени компиляции. – Yakk

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

Это просто пример.

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

Все, что я хочу сказать, что вы можете использовать #error также

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

Редактировать @Pratik Chowdhruy: Я согласен с Полом Р. Это не отвечает на вопрос напрямую. К сожалению сообществу

+0

Это не отвечает на вопрос. –

+0

Посмотрите на другие ответы, чтобы понять, в чем проблема: OP хочет знать, как выполнить утверждение времени компиляции в параметре шаблона, а не как использовать условную компиляцию и '# error'. –

+0

Извините Paul R –

1

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

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