समझ C++ 0x में एक अभ्यास के रूप में decltype का उपयोग करता है, मैं एक सी बनाने के लिए कोशिश कर रहा हूँ ++ वर्ग है कि कुछ टेम्पलेट ized प्रकार का एक सूचक लपेटता:instantiating एक टेम्पलेट में एक समारोह परिभाषा केवल कुछ निश्चित परिस्थितियों
template <typename T>
class Wrapper {
T *t;
/* ... */
};
रैपर वर्ग के अंदर, मैं किसी भी ओवरलोडेड ऑपरेटरों का खुलासा करना चाहता हूं जो टी रैपर वर्ग के माध्यम से लागू हो सकती हैं। रैपर स्वयं अंतर्निहित टी ऑब्जेक्ट को फ़ंक्शन कॉल को आगे बढ़ाता है।
template <typename U>
auto operator+(U &u) -> decltype (*t + u) {
return *t + u;
}
पकड़ है कि मैं आवरण उजागर ऑपरेटरों कि टी लागू नहीं कर सकें नहीं करना चाहती है। उदाहरण के लिए, यदि टी ऑपरेटर को लागू नहीं करता है तो फिर रैपर को ऑपरेटर + का पर्दाफाश नहीं करना चाहिए।
ऑपरेटर + (और किसी भी बाइनरी ऑपरेशन) के मामले में, सब कुछ काम करता है क्योंकि ऑपरेटर अनिवार्य रूप से टेम्पलेट फ़ंक्शन बन जाता है और इस प्रकार हम केवल तभी प्रयास करते हैं जब हम इनकार करने का प्रयास करते हैं, उदाहरण के लिए, रैपर :: ऑपरेटर +।
हालांकि, यूनरी ऑपरेटरों (उदाहरण के लिए, ++) के मामले में, ऑपरेटर की रक्षा करने का कोई स्पष्ट तरीका नहीं है ताकि यह तत्काल है अगर iff टी ऑपरेटर ++ लागू करता है। उदाहरण के लिए, इस वर्ग के
auto operator++() -> decltype(++(*t)) {
return ++(*t);
}
में ऑपरेटर ++ के अनुभवहीन कार्यान्वयन एक टी कि ऑपरेटर का समर्थन नहीं करता ++ (के लिए संकलित करने के लिए विफल रहता है)।
मानक की मेरी समझ से, हम निम्नलिखित कोड आवरण का उपयोग करता है अगर
class X { };
Wrapper<X> w;
हम आवरण और घोषणा आवरण :: ऑपरेटर की ++() करती है लेकिन उसके परिभाषा जब तक का दृष्टांत होगा हम इसे आमंत्रित करते हैं (या स्पष्ट रूप से इसे तुरंत चालू करते हैं)। आम तौर पर यह ठीक होगा, क्योंकि एक्स :: ऑपरेटर ++ का उपयोग केवल रैपर :: ऑपरेटर ++() की परिभाषा में होता है। हालांकि, decltype की वजह से, हम घोषणा में एक्स :: ऑपरेटर ++ का उपयोग करते हैं ताकि टाइपशेकर एक्स :: ऑपरेटर ++ के अस्तित्व के लिए जांच सके और इस प्रकार विफल हो जाता है।
हम ऑपरेटर परिभाषित कर सकता हूँ ++() (और सामान्य में किसी भी तरह के अग्रेषण समारोह decltype का उपयोग करता है) गुण है कि यह अंतर्निहित वस्तु iff instantiated है के साथ भी ऑपरेटर का समर्थन करता है ++()? या गिरावट के साथ टेम्पलेट तत्काल के अर्थशास्त्र दिया, क्या यह पूरा करना असंभव है?
संबंधित प्रश्न के रूप में: क्या यह पिछली वापसी 'decltype' में' this' को संदर्भित करना कानूनी है? विज़ुअल सी ++ 2010 और जी ++ 4.5.1 इसे पसंद नहीं करते हैं। –
@ जेम्स - एक महीने पहले से इस चर्चा को देखें [http://stackoverflow.com/questions/5147492/member-function-call-in-decltype ](http://stackoverflow.com/questions/5147492/member- कार्यक्षमता -call-इन-decltype)। –
@ बोपरसन: धन्यवाद! मुझे लगता है कि हम कुछ हफ्तों में पता लगाएंगे कि क्या उस बदलाव ने इसे सी ++ 0x में बनाया है। –