2012-11-11 25 views
10

का कार्यान्वयन मैं कोडप्रोजेक्ट में कुछ कोड के माध्यम से जा रहा था और सी ++ कास्टिंग के लिए निम्नलिखित कोड में आया था।सी ++ कास्ट

template <class OutputClass, class InputClass> 
union horrible_union{ 
    OutputClass out; 
    InputClass in; 
}; 
template <class OutputClass, class InputClass> 
inline OutputClass horrible_cast(const InputClass input){ 
    horrible_union<OutputClass, InputClass> u; 
    u.in = input; 
    return u.out; 
} 

कलाकारों ने उपरोक्त तरीके को क्यों लागू किया है। हम सिर्फ मैनुअल कास्ट क्यों नहीं कर सकते हैं। क्या कोई उदाहरण दे सकता है जब एक सामान्य कलाकार काम नहीं करेगा?

+4

एक अलग सदस्य स्थापित करने के बाद संघ के सदस्य तक पहुंच अपरिभाषित व्यवहार है, इसलिए इस 'horrible_union' दृष्टिकोण से कुछ भी बेहतर है। –

+0

शायद यही कारण है कि इसे भयानक कास्ट नाम दिया गया है। यह मूल रूप से कुछ कंपाइलर विशिष्ट व्यवहार को लागू करने के लिए है। – KodeWarrior

उत्तर

9

यह दृष्टिकोण मूल रूप से आपको किसी भी कलाकार से दूर जाने देता है, हालांकि यह अपरिभाषित व्यवहार पर निर्भर करता है।

असंबद्ध प्रकारों के बीच कास्टिंग करते समय एक सामान्य कलाकार शिकायत करेगा, जबकि यह नहीं होगा।

struct A{}; 
struct B{}; 

template <class OutputClass, class InputClass> 
union horrible_union{ 
    OutputClass out; 
    InputClass in; 
}; 
template <class OutputClass, class InputClass> 
inline OutputClass horrible_cast(const InputClass input){ 
    horrible_union<OutputClass, InputClass> u; 
    u.in = input; 
    return u.out; 
} 

int main() 
{ 
    A a; 
    B b; 
    a = horrible_cast<A,B>(b); //this compiles 
    a = reinterpret_cast<A>(b); //this doesn't 
} 

नीचे पंक्ति: यह भयानक है, ऐसा मत करो।

+1

यदि आप किसी विशेष आर्किटेक्चर पर काम कर रहे हैं और किसी विशेष कंपाइलर (कुछ एम्बेडेड सिस्टम के लिए) का उपयोग कर रहे हैं, तो यह केवल उस आर्किटेक्चर पर समझने वाले रूपांतरणों को टाइप करने के लिए एक वैध दृष्टिकोण हो सकता है। लेकिन यह अभी भी खतरनाक है, मैं सहमत हूं। – bitmask

2

इस तरह से एक संघ का उपयोग सामान्य रूप से पॉइंटर्स के हार्ड reinterpret_cast के बराबर है। हालांकि, यह वस्तुओं की प्रतिलिपि नहीं करता है, आपका उदाहरण करता है (वास्तव में आरवीओ के साथ भी दो बार, यह तर्क के रूप में const InputClass& input होने के बजाय और अधिक कुशल होगा)। तो आप संभवतः मूल ऑब्जेक्ट को म्यूट किए बिना इसके परिणाम पर सीधे संचालन कर सकते हैं।

यह वास्तव में क्या उपयोगी है ... एचएम। मुझे नहीं लगता कि वास्तव में कोई अच्छा उपयोग करने वाला मामला है, अनचेक जानवरों से हमेशा से बचा जाना चाहिए, और जैसा कि डेविड हैमैन ने टिप्पणी की है, वास्तव में यह पूरी तरह से अनिर्धारित है (हालांकि यह सामान्य रूप से काम करेगा, अगर "सही" इस्तेमाल किया जाता है)।

+0

हो सकता है कि उनकी दुकान में 'reinterpret_cast' के खिलाफ नीति हो, लेकिन यह छेड़छाड़ नहीं। – Barmar

+0

इस मामले में इसका उपयोग करने के लिए और भी भयानक होगा: 'reinterpret_cast' खतरनाक है, लेकिन यह एक और भी बदतर है। – leftaroundabout

+0

व्यक्तिगत रूप से, मैं इस तरह की कलाकारों को छिपाने से पहले 'reinterpret_cast' (और शायद इसके खिलाफ कोई नियम होने पर छूट के बाद जाना होगा) देखना पसंद करता हूं। –