C ++ 11 में, फ़ंक्शन घोषणा के लिए दो सिंटैक्स हैं:
रिटर्न-प्रकार पहचानकर्ता ( तर्क-घोषणाएँ ... )
तथा
auto पहचानकर्ता ( तर्क-घोषणाएँ ... ) -> return_type
वे बराबर हैं। अब जब वे समान हैं, तो आप कभी भी उत्तरार्द्ध का उपयोग क्यों करना चाहते हैं? खैर, सी ++ 11 ने इस शांत decltypeचीज़ को पेश किया है जो आपको अभिव्यक्ति के प्रकार का वर्णन करने की अनुमति देता है। इसलिए आप तर्क प्रकारों से वापसी प्रकार प्राप्त करना चाहते हैं। तो आप कोशिश करें:
template <typename T1, typename T2>
decltype(a + b) compose(T1 a, T2 b);
और संकलक आपको बताएगा कि यह नहीं जानता कि तर्क में क्या हैं aऔर क्या bहैं decltype। ऐसा इसलिए है क्योंकि वे केवल तर्क सूची द्वारा घोषित किए जाते हैं।
आप आसानी से समस्या के आसपास काम कर सकते हैं declvalऔर पहले से ही घोषित किए गए टेम्पलेट पैरामीटर। पसंद:
template <typename T1, typename T2>
decltype(std::declval<T1>() + std::declval<T2>())
compose(T1 a, T2 b);
सिवाय इसके कि वास्तव में अभी क्रिया हो रही है। इसलिए वैकल्पिक घोषणा सिंटैक्स प्रस्तावित और कार्यान्वित किया गया था और अब आप लिख सकते हैं
template <typename T1, typename T2>
auto compose(T1 a, T2 b) -> decltype(a + b);
और यह कम क्रिया है और स्कूपिंग नियमों को बदलने की आवश्यकता नहीं थी।
C ++ 14 अद्यतन: C ++ 14 भी केवल अनुमति देता है
auto पहचानकर्ता ( तर्क-घोषणाएँ ... )
जब तक उपयोग करने से पहले फ़ंक्शन को पूरी तरह से परिभाषित किया जाता है और सभी returnकथन एक ही प्रकार के होते हैं। ->यदि आप स्रोत फ़ाइल में शरीर को छुपाना चाहते वाक्य रचना सार्वजनिक कार्यों (शीर्षक में घोषित) के लिए उपयोगी रहता है। कुछ हद तक स्पष्ट रूप से टेम्पलेट्स के साथ नहीं किया जा सकता है, लेकिन कुछ ठोस प्रकार हैं (आमतौर पर टेम्पलेट मेटाप्रोग्रामिंग के माध्यम से प्राप्त होते हैं) जो अन्यथा लिखना मुश्किल है।