2010-03-17 17 views
6

मैं कैसे समझ सकते हैं कि यहाँ क्या घोषित किया जाता है: (इस this forum पर एक और पोस्ट से लिया जाता है)अजीब घोषणा (टेम्पलेट्स)। सी ++

template<typename C> static char (&f(ChT<int Fallback::*, &C::x>*))[1]; 

यहाँ मैं कैसे पढ़ें: स्थिर समारोह f(ChT<int Fallback::*, &C::x>*) साथ कहा जाता है की

टेम्पलेट, लेकिन फिर मैं समझ में नहीं आता है ऑपरेटर का पता क्यों है और एक सरणी क्यों है?

मैं अभी भी सी ++ घोषणाओं को समझने के तरीके सीख रहा हूं, इसलिए कृपया इसे धीरे-धीरे और सावधानी से समझाएं।

+0

आप ऐसा क्यों कर रहे हैं? – Axarydax

+0

@Axarydax क्या कर रहा है? –

+0

मुझे लगता है कि मैं देखता हूं कि उसे xD –

उत्तर

3

वापसी प्रकार देखना महत्वपूर्ण है। तो, इस फ़ंक्शन का रिटर्न प्रकार char[1] का संदर्भ है; कल्पना कीजिए कि f रिटर्न निम्नलिखित के संदर्भ की तरह कुछ:

char ret[1]; 

उदाहरण

template<typename C> static char (&f(ChT<int Fallback::*, &C::x>*))[1] 
{ 

    static char xx[1] = {'F'}; 
    return xx; 
} 
7

कुछ typedefs का उपयोग के लिए:

typedef char (&arrayref_t)[1]; 

इस वर्ण की एक सरणी के लिए एक संदर्भ है। सरणी में एक तत्व है।

typedef ChT<int Fallback::*, &C::x> tmpl_t; 

यह एक टेम्पलेट वर्ग, प्रकार "Fallback वर्ग का int सदस्य के लिए सूचक" के साथ instantiated, और कक्षा C में x करने के लिए एक सदस्य सूचक है।

static arrayref_t f(tmpl_t*); 

समारोह अब एक tmpl_t के लिए सूचक लेता है और एक arrayref_t देता है।

+0

मैंने अभी बहुत दिलचस्प बात देखी है (हाँ, मैं अभी भी इसे घुमा रहा हूं)। जहां आप कह रहे हैं "यह है ..., और क्लास सी में एक्स के लिए एक सदस्य सूचक", यह उल्लेख किया जाना चाहिए कि कक्षा सी में यह सदस्य सूचक वास्तव में क्लास सीटी की घोषणा के कारण कक्षा फॉलबैक का सदस्य है। तो एक तथ्य में वे एक-दूसरे से जुड़े हुए हैं। –

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