2013-04-24 22 views
6

napisałem funkcję:[Asercje czasu kompilacji w C++]: Czy możemy zrzucić błąd kompilacji, jeśli jakiś warunek nie zostanie spełniony?

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

ale ja tylko chcę go skompilować jeśli N jest w zakresie od 0 do 10. Czy mogę to zrobić? W jaki sposób?

+6

Spójrz na [static_assert] (http://en.cppreference.com/w/cpp/language/static_assert) – juanchopanza

+0

@juanchopanza: To jest odpowiedź. – Nawaz

+0

Wygląda świetnie! Ale czy jest coś pre-C++ 11? – MciprianM

Odpowiedz

13

Można to zrobić z 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(); 
    } 
} 

Ta funkcja jest dostępna tylko od C++ 11. Jeśli utkniesz w C++ 03, spójrz na Boost's static assert macro.

Cała idea to miłe komunikaty o błędach. Jeśli nie dbać o tych, lub może nawet nie affor doładowania, można zrobić coś jak następuje:

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

Zakłada się, że 'N' jest stałą czasową kompilacji, tho '. –

+1

Wykonane nieco prostsze, jeśli zmienisz go na 'szablon void tryHader() {static_assert (N <= 10," N out of bounds! ");' – Yakk

+4

@MatsPetersson jako argument szablonu, wydaje się bezpieczne założenie, że jest to stała czasowa kompilacji. – Yakk

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

Jest to tylko przykład.

Oto link źródło: http://msdn.microsoft.com/en-us/library/c8tk0xsk(v=vs.71).aspx

Wszystko mówię, jest to, że można użyć #error również

Jest to dyrektywa

Edit @Pratik Chowdhruy: Zgadzam się z Paul R. To nie odpowiada bezpośrednio na pytanie. Niestety do społeczności

+0

To nie odpowiada na pytanie. –

+0

Spójrz na inne odpowiedzi, aby zrozumieć, na czym polega problem - OP chce wiedzieć, jak wykonać asertywny test na parametrze szablonu, a nie jak używać kompilacji warunkowej i '# błędu'. –

+0

Przykro mi Paul R –

Powiązane problemy