2013-04-24 5 views
6

मैं एक समारोह लिखा है:[सी ++ संकलन समय सम्मिलन]: अगर कुछ शर्त पूरी नहीं हुई है तो क्या हम एक संकलन त्रुटि फेंक सकते हैं?

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

लेकिन मैं केवल तभी एन के बीच 0 और 10 मैं यह कर सकता है यह संकलन करना चाहते हैं? कैसे?

+6

[Static_assert] पर एक नज़र डालें (http://en.cppreference.com/w/cpp/language/static_assert) – juanchopanza

+0

@juanchopanza: यह उत्तर है। – Nawaz

+0

यह बहुत अच्छा लग रहा है! लेकिन क्या कुछ पूर्व-सी ++ 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(); 
    } 
} 

यह सुविधा सी ++ 11 के बाद से ही उपलब्ध है। यदि आप सी ++ 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

यह मानता है कि 'एन' एक संकलन समय निरंतर है, था '। –

+1

यदि आप इसे 'टेम्पलेट void tryHader() {static_assert (N <= 10, "सीमाओं से बाहर एन!") में बदलते हैं, तो थोड़ा आसान बना दिया गया है; ' – 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

यह समझने के लिए अन्य उत्तरों को देखें कि समस्या क्या है - ओपी एक टेम्पलेट पैरामीटर पर एक संकलन-समय पर जोर देना है, सशर्त संकलन और '# त्रुटि' का उपयोग कैसे करें। –

+0

मुझे खेद है पॉल आर –

1

पूर्व सी ++ 11 compilers के लिए करने के लिए क्षमा करें, आप गैर प्रकार पैरामीटर एन

ऐसा करने के तरीके के विवरण के लिए पर टेम्पलेट पैरामीटर बाधा को लागू कर सकता है, कृपया इसे देखें http://stroustrup.com/bs_faq2.html#constraints

संबंधित मुद्दे