2013-04-24 12 views
6

Ben bir işlev yazdı:[C++ derleme zaman iddiaları]: Bir koşul karşılanmazsa derleme hatası verebilir miyiz?

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

ama sadece N 0 ve 10. yapabilir miyim arasında ise o derlemek istiyoruz? Nasıl?

+6

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

+0

@juanchopanza [static_assert] göz at: O cevaptır. – Nawaz

+0

Harika görünüyor! Ama C++ 11 öncesi bir şey var mı? – MciprianM

cevap

13

Sen static_assert declaration ile yapabilirsiniz:

template<int N> void tryHarder() { 

    static_assert(N >= 0 && N <= 10, "N out of bounds!"); 

    for(int i = 0; i < N; i++) { 
     tryOnce(); 
    } 
} 

Bu özellik C++ 11 beri sadece DAİREMİZ. C++ 03 ile sıkışmışsanız, Boost's static assert macro'a bakın.

bu tüm fikri güzel hata mesajlarıdır. O umursamıyorum veya hatta boost affor, bir şeyler yapabileceğini aşağıda belirtildiği şekilde:

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

Bu, "N" nin bir derleme zamanı sabiti, 'olduğunu varsayar. şablona 'değiştirirseniz –

+1

biraz daha basit Yapılan hükümsüz tryHader() {static_assert (N <= 10, "N sınırların dışında!"); şablon argüman olarak' – Yakk

+4

@MatsPetersson, öyle görünüyor Güvenli bir varsayım, bir derleme zamanı sabiti. – Yakk

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

Bu sadece bir örnektir. İşte

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

i söylüyorum tek şey #error kullanabilirsiniz olmasıdır ayrıca

Bir direktifi

Düzenleme @Pratik Chowdhruy olduğunu

: Paul R. katılıyorum Bu doğrudan soruyu cevaplamaz. Önceden C++ 11 derleyici için topluluk

+0

Bu, soruya cevap vermiyor. –

+0

Sorunun ne olduğunu anlamak için diğer yanıtlara bakın - OP, bir derleme zamanının nasıl bir şablon parametresinde nasıl kullanılacağını bilmek ister; koşullu derlemeyi ve '# hatasını 'kullanmayı değil. –

+0

Üzgünüm Paul R –