2010-01-29 13 views
8

क्या किसी फ़ंक्शन के तर्क के रूप में पारित होने पर सरणी के आकार को प्रतिबंधित करने के लिए वैसे भी है?किसी फ़ंक्शन पर पास होने पर सरणी के आकार को प्रतिबंधित करना

मेरा मतलब है इस की तरह कुछ है?

/*following will lead to compile time error */ 

template<typename T, size_t n>=20> // or template<typename T,size_t n<=20> 
void func(T (&a)[n]) 
{ 
    // do something with a 

} 

मैं अपने सरणी के आकार में कम से कम (या अधिक से अधिक) n होना चाहते हैं (एन किसी भी मूल्य हो सकता है)।

उदाहरण के लिए:

जब n=20 मैं कम से कम (या अधिक से अधिक) 20 तत्वों के साथ एक सरणी से गुजरना होगा। क्या इसके लिए सी ++ में कोई रास्ता है?

+1

यदि सरणी सही आकार नहीं है तो आप क्या व्यवहार चाहते हैं? –

+1

@Neil: संकलन त्रुटि। –

उत्तर

15

आप बस आवश्यकता को एक स्थिर दावा कर सकते हैं - उदा। बढ़ा देता है स्थिर ज़ोर साथ:

template<typename T, size_t n> 
void func(T (&a)[n]) { 
    BOOST_STATIC_ASSERT(n >= 20); 
    // ... 
} 

एक बुनियादी कस्टम कार्यान्वयन (अधिक तो इसे प्रयोग की समस्या को हल नहीं एक बार गुंजाइश प्रति) ऐसा दिखाई दे सकता:

template<bool b> struct StaticAssert; 
template<> struct StaticAssert<true> {}; 
#define STATIC_ASSERT(x) StaticAssert<(x)> static_asserter 

यदि आप चाहते हैं अलग व्यवहार यदि आवश्यकता पूरी हो जाती है, तो enable_if या टैग-आधारित विशेषज्ञता जैसे कुछ का उपयोग करें। enable_if का उपयोग कर उदाहरण:

template<class T, size_t n> 
typename boost::enable_if<(n >= 20), void>::type 
func(T (&a)[n]) { /* ... */ } 

template<class T, size_t n> 
typename boost::disable_if<(n >= 20), void>::type 
func(T (&a)[n]) { /* ... */ } 
+2

नोट: आकार को जानना आपको अंत से परे पहुंचने से नहीं रोकता है (यानी कंपाइलर आपके सरणी इंडेक्स की जांच नहीं करेगा)। –

+0

+ 1 बहुत अंतरंग: इस मैक्रो के बारे में नहीं पता था, जो एक संकलन समय त्रुटि प्राप्त करने की अनुमति देता है। – sergiom

+0

सी ++ टेम्पलेट तंत्र गधे को मारता है! अगर आपको यह दिलचस्प लगता है कि किताबें मेरे उत्तर से मिलती हैं। : डी –

-2

आप जानना चाहते हैं कि कितने आइटम रनटाइम पर अपने सरणी में होगा टेम्पलेट का उपयोग करने के लिए (समय संकलन) कोशिश कर रहे हैं। ऐसा करना संभव नहीं है जैसे आप इसे करने का प्रयास करें।

आप अपने समारोह के बाहर या समारोह

+2

यह है कि, सी ++ में टेम्पलेट तंत्र पूर्ण ट्यूरिंग है। –

+0

सख्त अर्थ में Arrays संकलन समय पर उनके आकार तय है। – visitor

-3

वहाँ सी ++ में इस तरह के एक निर्माण नहीं है, कि तुम एक संकलन समय त्रुटि प्राप्त करने की अनुमति देता के अंदर कोड पर भरोसा करना होगा। लेकिन मुझे लगता है कि टेम्पलेट्स का उपयोग करके आप एक फ्रेमवर्क को कार्यान्वित कर सकते हैं जिसमें एक सीमित सरणी प्रकार के बजाय सीमित एरेरे वर्ग का उपयोग किया जा सकता है।

5

जीएफ का जवाब सही है, यदि आप संकलन समय पर अधिक सुविधाएं या निर्णय बिंदु चाहते हैं, तो आप boost::mpl पर देखना चाहेंगे। C++ Template Metaprogramming बूस्ट :: एमपीएल और यह कैसे डिज़ाइन किया गया था के साथ क्या संभव है की रूपरेखा बताती है। Modern C++ design, जो एमपीएल से संबंधित नहीं है, डिजाइन तकनीकों में जाता है जो संकलन समय polymorphism

+0

मैंने सोचा कि किसी को देखने के लिए लिंक का पालन नहीं करना चाहिए कि कौन सी किताबें संदर्भित हैं, बस इसे बदल दें यदि यह आपके अनुरूप नहीं है। –

+0

धन्यवाद जीएफ, मैं आलसी था: पी –

3

जीएफ का जवाब बहुत अच्छा है, लेकिन Boost.Array बिना किसी उल्लेख के जा सकते हैं।

template< typename T > 
void func(boost::array< T, 20 > &a) { 

अपने प्रश्न और GF के जवाब को देखते हुए यह T(&)[20]some_array_template<T,20> करने से एक computationally, नि: शुल्क type- और सीमा-सुरक्षित अंतर्निहित रूपांतरण की तरह दिखता है शब्दार्थ संभव होगा, लेकिन boost::array कि अनुमति नहीं है। फिर भी, यदि आपके पास बहुत सारे तर्क हैं तो आप पूरी तरह से boost::array पर जाने पर विचार कर सकते हैं। और यदि आप निहित रूपांतरण चाहते हैं, तो खुद को रोल करने के आधार के रूप में उपयोग करना काफी आसान है।

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