2014-09-16 7 views
6

मैं अपने कोडबेस का हिस्सा सी ++ 11 से सी ++ 14 तक अपग्रेड कर रहा हूं। मेरे पास कई गणित उपयोगिता फ़ंक्शन हैं जो एकाधिक इनपुट तर्क लेते हैं और std::common_type_t<...> प्रकार के एकल मान को वापस करते हैं।क्या यह हमेशा से सुरक्षित है सी ++ 14 के ऑटो फ़ंक्शन प्रकार का उपयोग std :: common_type के स्थान पर वापसी कटौती?

मैं स्पष्ट वापसी मूल्य को एक साधारण auto के साथ बदलने की सोच रहा हूं। मुझे लगता है कि कटौती टाइप इन मामलों में एक आम प्रकार खोजने की कोशिश करता है। क्या कोई ऐसा मामला है जहां यह काम नहीं करेगा?

यह हमेशा सुरक्षितauto साथ std::common_type_T<...> वापसी मान की सभी घटनाओं कन्वर्ट करने के लिए है?

उदाहरण समारोह:

template<typename T1, typename T2, typename T3> 
std::common_type_t<T1, T2, T3> getClamped(T1 mValue, T2 mMin, T3 mMax) 
{  
    return mValue < mMin ? mMin : (mValue > mMax ? mMax : mValue); 
} 
+0

नहीं, लेकिन?: एक आम प्रकार है। –

+0

क्या मैं पूछ सकता हूं कि आप इस तरह के फ़ंक्शन के लिए विभिन्न प्रकार के तर्क क्यों लेते हैं और न केवल एक ही प्रकार के? – mattnewport

+0

@mattnewport: शायद क्योंकि यह अन्यथा नहीं लिया जा सकता है। सोचें 'std :: min (1, 1.) '। इस विशेष मामले के लिए न्यूनतम/अधिकतम पर कटौती को रोकने के लिए बेहतर होगा, लेकिन यह सामान्य मामले में लागू नहीं होता है। –

उत्तर

7

नहीं, यह हमेशा सुरक्षित नहीं है।

मुझे लगता है कि आपके गणित कार्य इस से अधिक करते हैं, लेकिन यहां एक उदाहरण है जहां परिणाम अलग होगा।

template <class T, class U> 
std::common_type_t<T, U> add(T t, U u) { return t + u; } 

यदि आप दो char रों परिणाम के साथ इस समारोह फोन एक char हो जाएगा। क्या आप वापसी प्रकार को स्वचालित रूप से घटाएंगे, यह int उत्पन्न करेगा।

+0

@ जारोड 42 इसे याद करना आसान है, लेकिन वह 'std :: common_type_t' का उपयोग नहीं किया गया है, न कि' std :: common_type'। इसका मतलब है कि आपको 'typename std :: XXX :: type' के साथ एक विशेषता को घेरने की आवश्यकता नहीं है। हालांकि, यह केवल सी ++ 14 में मान्य है। –

+0

@ फिलहाइट: मेरी टिप्पणी विटोरियो के संपादन से पहले थी। लेकिन धन्यवाद, अब मैं अपनी अप्रचलित टिप्पणी हटा सकता हूं। – Jarod42

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