2016-02-18 8 views
9

मुझे पता है कि सी में विभिन्न कास्टिंग ऑपरेटरों ++ पहले से ही यहाँ कई बार चर्चा की गई है, लेकिन मेरे सवाल का के बीच संख्यात्मक प्रकार कास्टिंग के बारे में विशेष रूप से है, नहीं सी शैली और C के बीच सामान्य अंतर के बारे में ++ शैली ऑपरेटर। मैं इसे कक्षा पदानुक्रम के भीतर कास्टिंग करने से एक बिल्कुल अलग विषय मानता हूं।सी ++ सांख्यिक प्रकार के बीच कास्टिंग

मैं एक डबल करने के लिए एक पूर्णांक i कास्ट करना चाहते हैं कहो, विकल्प मेरे पास से कुछ हैं

static_cast<double>(i) 
(double) i 
double(i) 

व्यक्तिगत तौर पर मैं इस मामले में 3 लाइन में निर्माता की तरह शैली पसंद करते हैं क्योंकि मैं व्यक्त करना कि यह एक कास्ट बेटी वर्ग प्रकार नहीं है, जहां मैं निश्चित रूप से static_cast या dynamic_cast का उपयोग करता हूं।

टेक्स्ट एडिटर में खोज करते समय इस प्रकार के कलाकार को ढूंढना मुश्किल हो जाने के अलावा, क्या मेरी पसंद में कोई कमी है?

+1

संदर्भ क्या है? आपको क्यों डालना है? –

+0

@ करोलि हॉर्वथ: अच्छा सवाल, मैं हमेशा कास्ट से बचने की कोशिश करता हूं, लेकिन सामान्य मामलों जहां मैं ऐसा करता हूं गणनाओं के भीतर या कार्य तर्कों को पार करते समय होता है। –

+4

"इस प्रकार के कास्ट को ढूंढना मुश्किल है" इसका उपयोग करने के लिए पर्याप्त कारण नहीं है। –

उत्तर

4

static_cast<double>(i) निश्चित रूप से इस विशेष मामले में आपके इरादे की स्पष्ट अभिव्यक्ति है।

संख्यात्मक प्रकारों के बीच कास्टिंग करते समय, आप अक्सर एक पत्थर को अपरिभाषित व्यवहार से दूर फेंक देते हैं। तो सामान्य रूप से सावधान रहें। यद्यपि आपकी कास्ट i के प्रत्येक संभावित मूल्य के लिए परिभाषित की गई है, double को intint ओवरफ़्लो कर सकता है, और यह व्यवहार C++ में अपरिभाषित है।

मैं हमेशा आपकी जांच की सलाह दूंगा कि गंतव्य प्रकार स्रोत प्रकार को समायोजित कर सकता है या नहीं। std::numeric_limits<>::max() इत्यादि यहां मदद कर सकते हैं।

सी ++ मानक int (हालांकि 16, 32, और 64 बिट 2 के पूरक सामान्य हैं) का अधिकतम आकार निर्दिष्ट नहीं करता है, इसलिए संभावित रूप से यह double के रूप में प्रतिनिधित्व योग्य नहीं हो सकता है।

मेरी कोड में मैं एक नाम स्थान

template< 
     typename T/*the desired type*/, 
     typename/*the source type*/ Y 
    > T integral_cast(const Y& y) 
    { 
     static_assert(false, "undefined integral_cast"); 
    } 

जो मैं हर सांख्यिक डाली मैं जरूरत के लिए विशेषज्ञ युक्त है।

+2

'static_cast' आपको अपरिभाषित व्यवहार से यहां नहीं बचाएगा। और ओपी ने इस विशेष मामले में अपनी पसंदीदा कलाकारों के लिए एक बहुत अच्छा बिंदु दिया। – StoryTeller

+0

दरअसल, लेकिन यह लिखने का एक बहुत ही स्पष्ट तरीका है। लेकिन ध्यान दें कि 'int' से' डबल 'तक कास्टिंग * हमेशा * परिभाषित किया गया है। – Bathsheba

+0

यह राय आधारित है। यह निश्चित रूप से और अधिक खड़ा है, लेकिन 'int' से नया 'डबल' बनाने की धारणा भी बहुत स्पष्ट है। – StoryTeller

3

उन दृष्टिकोणों का एक बड़ा दोष यह है कि कास्ट ओवरफ्लो और अन्य संख्यात्मक त्रुटियों के खिलाफ सुरक्षित नहीं है।

static_cast का उपयोग तत्काल साइन समाधान है और यह विधि PVS studio जैसे स्थिर कोड विश्लेषकों के उपकरण द्वारा ध्वजांकित नहीं है। (double)i दृष्टिकोण एक चेतावनी उत्पन्न करता है।

शायद सबसे सुरक्षित तरीका अपने स्वयं के कलाकारों चलो कहना numeric_cast<T>()

template <class OT, class ST> 
OT numeric_cast(const ST value) 
{ 
    return static_cast<OT>(value); 
} 

इस समारोह का लाभ यह है कि आप के लिए बाध्य चेक और अन्य संख्यात्मक जांच कर सकते हैं सुनिश्चित करना है कि कलाकारों वैध है और ऐसा नहीं करता है है वापसी (या प्राप्त) जंक मूल्यों।

संख्याओं से निपटने का एक और तरीका है लेकिन यह केवल स्थिर संकलन-समय मानों के साथ काम करता है। इस चेक के लिए user defined string literals

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