जीसीसी 4.8.0 जारी होने के साथ, हमारे पास एक कंपाइलर है जो स्वचालित रिटर्न प्रकार कटौती का समर्थन करता है, सी ++ 14 का हिस्सा है। इसके साथ -std=c++1y
, मैं यह कर सकता हूं:
auto foo() { //deduced to be int
return 5;
}
मेरा प्रश्न है: मुझे इस सुविधा का उपयोग कब करना चाहिए? यह कब आवश्यक है और यह कोड क्लीनर कब बनाता है?
दृष्टांत 1
जब भी संभव हो मैं पहला परिदृश्य सोच सकता हूं। प्रत्येक फ़ंक्शन जिसे इस तरह लिखा जा सकता है, होना चाहिए। इसके साथ समस्या यह है कि यह हमेशा कोड को अधिक पठनीय नहीं बना सकता है।
दृश्य २
अगला परिदृश्य अधिक जटिल रिटर्न प्रकारों से बचने का है। बहुत हल्के उदाहरण के रूप में:
template<typename T, typename U>
auto add(T t, U u) { //almost deduced as decltype(t + u): decltype(auto) would
return t + u;
}
मुझे विश्वास नहीं है कि यह वास्तव में एक समस्या होगी, हालांकि मुझे लगता है कि रिटर्न प्रकार स्पष्ट रूप से मापदंडों पर निर्भर करता है कुछ मामलों में स्पष्ट हो सकता है।
परिदृश्य 3
अगला, अतिरेक को रोकने के लिए:
auto foo() {
std::vector<std::map<std::pair<int, double>, int>> ret;
//fill ret in with stuff
return ret;
}
C ++ 11 में, हम कभी-कभी return {5, 6, 7};
एक वेक्टर के स्थान पर हो सकते हैं , लेकिन यह हमेशा काम नहीं करता है और हमें फ़ंक्शन हेडर और फ़ंक्शन बॉडी दोनों में टाइप निर्दिष्ट करना होगा। यह विशुद्ध रूप से निरर्थक है, और स्वचालित वापसी प्रकार हमें उस अतिरेक से बचाता है।
परिदृश्य 4
अंत में, यह बहुत ही सरल कार्यों के स्थान पर उपयोग किया जा सकता है:
auto position() {
return pos_;
}
auto area() {
return length_ * width_;
}
कभी-कभी, हालांकि, हम फ़ंक्शन को देख सकते हैं, सटीक प्रकार जानना चाहते हैं, और यदि यह वहां प्रदान नहीं किया गया है, तो हमें कोड में एक अन्य बिंदु पर जाना होगा, जहां pos_
घोषित किया गया है।
निष्कर्ष
उन परिदृश्यों के साथ, उनमें से कौन सा वास्तव में एक ऐसी स्थिति साबित होती है जहां यह सुविधा कोड क्लीनर बनाने में उपयोगी है? उन परिदृश्यों के बारे में जिन्हें मैंने यहाँ उल्लेख करने के लिए उपेक्षित किया है? इस सुविधा का उपयोग करने से पहले मुझे क्या सावधानी बरतनी चाहिए ताकि बाद में यह मुझे काट न सके? क्या कुछ नया है जो इस सुविधा को टेबल पर लाता है जो इसके बिना संभव नहीं है?
ध्यान दें कि कई प्रश्नों का अर्थ यह है कि यह उत्तर देने के लिए दृष्टिकोण खोजने में एक सहायता होगी।
->decltype(t+u)
ऑटो कटौती के साथ प्रतिस्थापित SFINAE को मारता है।