2011-05-25 7 views
5

मैं बूस्ट प्रकार-लक्षण हेडर के माध्यम से जाने की कोशिश कर रहा हूं, और अब अनगिनत # परिभाषा द्वारा प्रदान की गई गहन अपठनीयता के कारण काफी बीमार महसूस कर रहा हूं। और फिर कुछ और # परिभाषित करें।बूस्ट टाइप_ट्रेट्स is_array

विशिष्ट होने के लिए, मुझे निम्नलिखित 3 लक्षणों के बारे में पता लगाने में दिलचस्पी है: यदि कोई प्रकार टी एक सरणी, एक वर्ग या enum है।

क्या कोई स्पष्ट पागलपन के पीछे विधि को समझने का कोई तरीका सुझा सकता है?

template<class T> 
struct is_array{ 
    static const bool value = false; 
}; 

template<class T, std::size_t N> 
struct is_array< T (&)[N] >{ 
    static const bool value = true; 
}; 

बस एक साधारण आंशिक विशेषज्ञता एक संदर्भ-हैं- पर: कैसे आप एक प्रकार, किसी भी प्रासंगिक पठन सामग्री आदि से विशेषता यह पता लगाने के पीछे सिद्धांत की तरह

+0

अनगिनत ifdefs से छुटकारा पाने का एक तरीका है जो आपको परेशान करता है कोड कोड गड़बड़ी प्रीप्रोसेसर चलाने के लिए, यानी 'gcc' के साथ' -E' विकल्प का उपयोग करना है। फिर आप उस कोड को देख सकते हैं जो आपके कंपाइलर द्वारा आपके प्लेटफॉर्म के लिए संकलित किया जाएगा। आम तौर पर, एसएफआईएनएई, टेम्पलेट (आंशिक) विशेषज्ञता, और कंपाइलर-विशिष्ट एक्सटेंशन का उपयोग करके लक्षण लागू किए जाते हैं। बूस्ट हेडर में गोता लगाने के लिए –

+0

+1। ;) मैं वास्तव में केवल उस सिफारिश की सिफारिश कर सकता हूं, विशेष रूप से बूस्ट। फ़ंक्शन हेडर जहां मेरे लिए काफी शैक्षिक है। – Xeo

उत्तर

4

is_array बहुत सरल और सीधे आगे है सरणी प्रकार

is_class थोड़ा अधिक जटिल है और ओवरलोड रिज़ॉल्यूशन पर निर्भर करता है और तथ्य यह है कि कक्षाओं और संरचना में रचनाकार (या विनाशक) होते हैं। जैसा कि मैं वर्तमान में अपने आईपॉड टच पर हूं, मैं वास्तव में एक उदाहरण नहीं दिखा सकता। जैसे ही मुझे एक पीसी में फिर से पहुंच है, मैं एक को संपादित कर दूंगा।

is_enum मेरा मानना ​​है कि कंपाइलर इंट्रिनिक्स पर निर्भर करता है, इसलिए कोई उदाहरण नहीं है।

नोट: यहां सब कुछ स्मृति से है, मैं enum के साथ गलत हो सकता है।

+0

आप 'is_enum' के बारे में सही हैं, और यह' is_pod' के लिए भी सही है। – ildjarn

+0

@ildjarn: मुझे विजुअल सी ++ में विश्वास है कि हर प्रकार की विशेषता को संकलक इंट्रिनिक्स/एक्सटेंशन का उपयोग करके लागू किया गया है, जहां तक ​​मैंने देखा है। आखिरकार, कंपाइलर प्रकार के बारे में सबसे अच्छा जानता है, नहीं? ':)' – Xeo

+0

@Xeo: मेरा कहना है कि विशेष रूप से उन दो प्रकार के लक्षणों को _only_ को कंपाइलर इंट्रिनिक्स के उपयोग के साथ कार्यान्वित किया जा सकता है, जबकि बाकी को सरल मेटाफंक्शन के साथ कार्यान्वित किया जा सकता है। – ildjarn