2012-04-12 11 views
5

संभव डुप्लिकेट के लिए किसी भी typeid अनुकूलन:
When can typeid return different type_info instances for same type?बढ़ावा :: सी ++ 11

अगर मैं &operand->type() == &typeid(ValueType) में नीचे operand->type() == typeid(ValueType) लाइन बदलने के लिए, कोड अभी भी जीसीसी के साथ काम करता है और ले जाता है निष्पादन योग्य में कम जगह (और अब कई सालों से ऐसा किया गया है), लेकिन क्या सी ++ 11 मानक कोई गारंटी देता है, कि यह अनुकूलन विभिन्न कंपेलरों में काम करना चाहिए?

template<typename ValueType> 
ValueType * any_cast(any * operand) 
{ 
    return operand && 
#ifdef BOOST_AUX_ANY_TYPE_ID_NAME 
     std::strcmp(operand->type().name(), typeid(ValueType).name()) == 0 
#else 
     operand->type() == typeid(ValueType) 
#endif 
     ? &static_cast<any::holder<ValueType> *>(operand->content)->held 
     : 0; 
} 
+0

यह तकनीकी रूप से एक C++ 03 प्रश्न है, और यह एक C++ 11 है। इसे स्पष्ट रूप से डुप्लिकेट नहीं करने के लिए संपादन (उत्तर अभी भी सही है) – MSalters

उत्तर

5

नहीं, इसकी गारंटी नहीं है। यह ज़ोर गति प्रदान कर सकते:

assert(&typeid(int) == &typeid(int)); 

यह है कि आग बनाने के लिए एक बहुत बेवकूफ संकलक ले जाएगा है, यह भी हो सकता है। व्यवहार में, यह केवल असफल हो जायेगी जब typeid की गतिशील पुस्तकालय सीमाओं के पार तुलना में किया जा रहा है:

assert(&typeid_of_int_in_lib1() == &typeid_of_int_in_lib2()); 

यह लगभग निश्चित रूप से ट्रिगर किया जाएगा।

+1

इस पोस्ट को मिला, यह दावा विंडोज़ में आग लग सकता है, लेकिन लिनक्स में नहीं हो सकता है: [link] (http://stackoverflow.com/questions/1819114/when- कैन-टाइपिड-रिटर्न-अलग-प्रकार-जानकारी-उदाहरण-समान-प्रकार) – user1095108

+0

@ user1095108: आह, सब के बाद डुप्लिकेट। :) – GManNickG

+0

पूरी तरह से नहीं, लोग स्थिर रूप से लिंक करते हैं, तो भी लोग अपने किसी भी एचपीपी को हैक कर सकते हैं। – user1095108