2010-03-17 22 views
7

कल की पोस्ट का जिक्र करते हुए, इस सुबह मुझे जाग गया। यह वास्तव में क्यों काम करता है? जब तक कार्य test चिंतित है, इस समारोह में कोई शरीर नहीं है, तो यह कुछ भी कैसे कर सकता है? मैं जानना चाहता हूं कि यह क्यों और कैसे काम करता है? मैं वास्तव में आपके उत्तरों को देखने में दिलचस्पी रखता हूं।यह क्यों काम करता है (टेम्पलेट्स, SFINAE)। सी ++

template<typename T> 
class IsClassT { 
    private: 
    typedef char One; 
    typedef struct { char a[2]; } Two; 
    template<typename C> static One test(int C::*); //NO BODY HERE 
    template<typename C> static Two test(…); //NOR HERE 
    public: 
    enum { Yes = sizeof(IsClassT<T>::template test<T>(0)) == sizeof(One) }; 
    enum { No = !Yes }; 
}; 

इस बहुत ही रोचक घटना को समझने में सहायता के साथ अग्रिम धन्यवाद।

+0

Standardese के लिए, '3.2/2' और देखो' 3.2/3' (और "का उपयोग" की परिभाषा के "का उपयोग कर परिणामों पर दोनों " कुछ कुछ)। –

उत्तर

6

मुझे लगता है कि आप हां enum के लिए referring कर रहे हैं? IsClassT<T>::test<T>(0)? आकार वास्तव में अपने तर्कों का मूल्यांकन नहीं करता है। क्यों निम्नलिखित की तरह कोड कानूनी है कि, भले ही आप यह आप पर को उबारने के लिए उम्मीद कर सकते हैं:

int* p = 0; 
int sizeof_int = sizeof(*p); //oops, p is 0 :(
+0

मुझे वास्तव में क्या दिलचस्पी है, भले ही परीक्षण में कोई शरीर न हो, मुझे इसके लिए कोई त्रुटि नहीं है? –

+7

क्योंकि रिटर्न प्रकार शरीर के बिना संकलन समय पर जाना जाता है। यह बस 'char' या' char [2] 'है। यह सभी कंपाइलर जरूरत है, और यह मानक द्वारा स्वीकृत है। स्पष्ट होने के लिए, 'sizeof' फ़ंक्शन के वापसी मान पर लागू होता है (नहीं, उदाहरण के लिए, फ़ंक्शन का कोड आकार), और गणना करने के लिए कि आपको केवल उस प्रकार की वास्तविक वस्तु नहीं है, उस प्रकार की आवश्यकता है। – Ari

8
  1. आप संकलक त्रुटि क्योंकि test समारोह घोषणा मौजूद नहीं मिल सकता है।

  2. आपको लिंकर त्रुटि नहीं मिल सकती है क्योंकि आप test -Function पर कॉल न करें।

सी ++ Standart आईएसओ/आईईसी 14882: 2003 (ई)

5.3.3 sizeof

sizeof ऑपरेटर अपनी संकार्य के वस्तु प्रतिनिधित्व में बाइट की संख्या पैदावार । ऑपरेंड या तो एक अभिव्यक्ति है, जो का मूल्यांकन, या कोष्ठक प्रकार-आईडी का मूल्यांकन नहीं किया जाता है। sizeof ऑपरेटर नहीं करेगा ...

...

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