2010-01-31 20 views
49

का उपयोग करने के बीच अंतर मैं सोच रहा हूं कि टेम्पलेट मेटाप्रोग्रामिंग तकनीकों का उपयोग करते समय एक स्थिर कॉन्स और एनम हैक का उपयोग करने के बीच क्या अंतर है।टेम्पलेट मेटाप्रोग्रामिंग - एनम हैक और स्टेटिक कॉन्स

पूर्व: (TMP के माध्यम से फाइबोनैचि)

template< int n > struct TMPFib { 
    static const int val = 
    TMPFib< n-1 >::val + TMPFib< n-2 >::val; 
}; 

template<> struct TMPFib<1> { 
    static const int val = 1; 
}; 

template<> struct TMPFib<0> { 
    static const int val = 0; 
}; 

बनाम

template< int n > struct TMPFib { 
    enum { 
    val = TMPFib< n-1 >::val + TMPFib< n-2 >::val 
    }; 
}; 

template<> struct TMPFib<1> { 
    enum { val = 1 }; 
}; 

template<> struct TMPFib<0> { 
    enum { val = 0 }; 
}; 

क्यों एक दूसरे के ऊपर का उपयोग करें? मैंने पढ़ा है कि कक्षाओं के अंदर स्थिर कॉन्स का समर्थन करने से पहले enum hack का उपयोग किया गया था, लेकिन अब इसका उपयोग क्यों करें?

+0

+1: वास्तव में एक महान सवाल है, और मैं यह भी देखना चाहूंगा कि उत्तर स्पष्ट के अलावा क्या होगा। –

+2

स्थिर कॉन्स int के अलावा अन्य प्रकार की अनुमति देता है। उदाहरण के लिए डबल। –

उत्तर

34

Enums नहीं lvals, स्थिर सदस्य मान हैं कर रहे हैं और संदर्भ द्वारा पारित कर दिया है, तो टेम्पलेट instanciated किया जाएगा:

void f(const int&); 
f(TMPFib<1>::value); 

आप शुद्ध संकलन समय गणना करने के लिए चाहते हैं आदि इस किसी अवांछित पक्ष प्रभाव है ।

मुख्य ऐतिहासिक अंतर यह है कि enums भी कंपाइलरों के लिए काम करता है जहां सदस्य मूल्यों के कक्षा-प्रारंभिकता समर्थित नहीं है, यह अब अधिकांश कंपाइलरों में तय किया जाना चाहिए।
एनम और स्थिर कॉन्स के बीच संकलन गति में भिन्नता भी हो सकती है।

इस विषय के बारे में बढ़ावा संग्रह में boost coding guidelines और older thread में कुछ विवरण हैं।

12

कुछ के लिए पहले एक हैक कम हो सकता है, और अधिक प्राकृतिक। यदि आप कक्षा का उपयोग करते हैं तो इसके लिए स्मृति आवंटित की जाती है, इसलिए आप उदाहरण के लिए वैल का पता ले सकते हैं।

उत्तरार्द्ध कुछ पुराने कंपाइलर्स द्वारा बेहतर समर्थित है।

+0

धन्यवाद। वास्तव में जिस तरह का उत्तर मैं ढूंढ रहा था। – Anonymous

+1

व्यक्तिगत रूप से मैं पूरी तरह से असहमत हूं। फिर enum संस्करण अधिक प्राकृतिक लगता है। भौतिक चर की आवश्यकता क्यों है? एनम एक कॉन्स वैल्यू का प्रतिनिधित्व है। स्थिर स्थिरांक int का उपयोग करना उस समय के लिए एक कदम पीछे की तरह लगता है जब हमें निरंतर मूल्यों का प्रतिनिधित्व करने के लिए मैक्रोज़ का उपयोग करना पड़ता था। –

+2

@ मार्टिन, गणना के साथ कीवर्ड गणना क्या है? लेकिन बिंदु ले लिया - हर किसी के पास अपना स्वयं का बिंदु हो सकता है। –

1

फ्लिप पक्ष पर @Georg के उत्तर पर, जब एक स्थिर स्थिरांक चर युक्त एक संरचना को एक विशेष टेम्पलेट में परिभाषित किया गया है, तो इसे स्रोत में घोषित करने की आवश्यकता है ताकि लिंकर इसे ढूंढ सके और वास्तव में इसे एक पता दे सके द्वारा संदर्भित किया जाना चाहिए। यह अनावश्यक रूप से (वांछित प्रभावों के आधार पर) असीमित कोड का कारण बन सकता है, खासकर यदि आप केवल हेडर लाइब्रेरी बनाने की कोशिश कर रहे हैं। आप मूल्यों को उन कार्यों में परिवर्तित करके हल कर सकते हैं जो मूल्य लौटाते हैं, जो टेम्पलेट्स को रन-टाइम जानकारी के साथ भी खोल सकते हैं।

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