2013-04-24 6 views
6

ho scritto una funzione:[C++ compile time assertions]: possiamo generare un errore di compilazione se alcune condizioni non sono soddisfatte?

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

ma voglio soltanto che per compilare se N è tra 0 e 10. Posso farlo? Come?

+6

Dai un'occhiata a [static_assert] (http://en.cppreference.com/w/cpp/language/static_assert) – juanchopanza

+0

@juanchopanza: questa è la risposta. – Nawaz

+0

Sembra fantastico! Ma c'è qualcosa di pre-C++ 11? – MciprianM

risposta

13

È possibile farlo con 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(); 
    } 
} 

Questa funzione è solo avaliable dal C++ 11. Se sei bloccato con C++ 03, dai un'occhiata a Boost's static assert macro.

L'intera idea di questo sono messaggi di errore piacevoli. Se non si cura per coloro che, o si può nemmeno affor spinta, si potrebbe fare qualcosa nel modo seguente:

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

Questo presuppone che 'N' è una costante di tempo di compilazione, tho '. –

+1

Semplificato leggermente se lo si cambia in 'template void tryHader() {static_assert (N <= 10," N out of bound! ");' – Yakk

+4

@MatsPetersson come argomento modello, sembra un presupposto sicuro è una costante di tempo di compilazione. – Yakk

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

Questo è solo un esempio.

Ecco il link fonte: http://msdn.microsoft.com/en-us/library/c8tk0xsk(v=vs.71).aspx

Tutto quello che sto dicendo è che si può utilizzare anche #error

Si tratta di una direttiva

Edit @Pratik Chowdhruy: Sono d'accordo con Paul R. Questo non risponde direttamente alla domanda. Ci dispiace per la comunità

+0

Questo non risponde alla domanda. –

+0

Guarda le altre risposte per capire qual è il problema qui - l'OP vuole sapere come fare un asserimento in fase di compilazione su un parametro template, non come usare la compilazione condizionale e '# error'. –

+0

Mi dispiace Paul R –

Problemi correlati