2013-04-24 5 views
6

Ich schrieb eine Funktion:[C++ Kompilierung Zeit Zusicherungen]: Können wir einen Kompilierungsfehler werfen, wenn eine Bedingung nicht erfüllt ist?

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

aber ich will es nur kompilieren, wenn N zwischen 0 und 10 ist, kann ich es tun? Wie?

+6

Siehe [static_assert] (http://en.cppreference.com/w/cpp/language/static_assert) – juanchopanza

+0

@juanchopanza: Das ist die Antwort. – Nawaz

+0

Es sieht gut aus! Aber gibt es irgendetwas vor C++ 11? – MciprianM

Antwort

13

Sie können es mit 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(); 
    } 
} 

Diese Funktion ist nur avaliable da C++ 11. Wenn Sie mit C++ 03 festgefahren sind, werfen Sie einen Blick auf Boost's static assert macro.

Die ganze Idee davon sind nette Fehlermeldungen. Wenn Sie nicht für diejenigen kümmern, oder kann nicht einmal affor Schub, könnten Sie etwas tun, wie folgt:

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

Dies setzt voraus, dass "N" eine Kompilierzeitkonstante tho 'ist. –

+1

Etwas einfacher gemacht, wenn Sie es ändern in 'template void tryHader() {static_assert (N <= 10," N außerhalb der Grenzen! ");' – Yakk

+4

@MatsPetersson als Vorlage Argument, so scheint es eine sichere Annahme ist eine Kompilierzeitkonstante. – Yakk

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

Dies ist nur ein Beispiel. Hier

ist die Quelle Link: http://msdn.microsoft.com/en-us/library/c8tk0xsk(v=vs.71).aspx

Alles, was ich sagen will, ist, dass Sie verwenden #error können auch

Es ist eine Richtlinie

bearbeiten @Pratik Chowdhruy: Ich stimme mit Paul R. Dies beantwortet die Frage nicht direkt. Es tut uns Leid für die Gemeinschaft

+0

Das beantwortet die Frage nicht. –

+0

Schauen Sie sich die anderen Antworten an, um zu verstehen, worum es hier geht - das OP möchte wissen, wie man eine Kompilierungszeit für einen Template-Parameter ausführt, nicht wie bedingte Kompilierung und '# error' verwendet werden. –

+0

Es tut mir leid Paul R –