मान लीजिए मैं निम्नलिखित वर्ग टेम्पलेट है:आकार
template<typename T>
struct Wrapper {
T* t_;
static void check() {
static_assert(sizeof(Wrapper<T> == sizeof(T*), "Illegal assumption");
}
};
मैं सी ++ 03 मानक में एक C99 मानक में देखा और एक गारंटी नहीं मिल सकता है के लिए मेरे इस धारणा में व्यक्त किया static_assert
। मैंने इसे कई संकलक विकल्पों का उपयोग करके विजुअल सी ++ 2008 और 2010 (32 बिट) और लिनक्स (64 बिट) पर जीसीसी पर कोशिश की और मेरी धारणा की पुष्टि हुई।
मेरा प्रश्न हैं:
- मेरी धारणा विजुअल C++ 2008/2010/11 (विंडोज़) के लिए उचित है?
- जीसीसी 4. * (लिनक्स) के लिए?
- कंपाइलर झंडे के किसी भी संयोजन के लिए?
- क्या आप किसी भी कंपाइलर/मंच के बारे में जानते हैं जहां यह धारणा सच नहीं है?
मुझे लगता है कि एक कंपाइलर संरचना में कुछ पैडिंग जोड़ सकता है उदा। डिबगिंग उद्देश्यों के लिए। लेकिन क्या एक कंपाइलर है जो वास्तव में करता है?
संपादित करें: तो तुम यहाँ से पूछा कि मैं क्या हासिल करना चाहते हैं के रूप में:
मैं निम्नलिखित हस्ताक्षर के साथ सदस्य समारोह है:
Someclass* OtherClass::fn();
मैं इस तरह हस्ताक्षर बदलना चाहते हैं:
Wrapper<Someclass> OtherClass::fn();
यह रैपर कुछ स्मार्ट-पॉइंटर की तरह कार्य करता है, यानी यह सूचक के जीवनकाल की परवाह करता है, इस प्रकार यह दायरे से बाहर होने पर इसे रिलीज़ करता है। चूंकि फ़ंक्शन को एक डीएलएल सीमा में बुलाया जाता है, मैं यह सुनिश्चित करना चाहता हूं कि लौटा हुआ मूल्य (जो अब एक ठोस प्रकार है, न केवल एक गूंगा सूचक) सभी परिस्थितियों में (यानी संकलक सेटिंग्स, आदि) सूचक के समान आकार के रूप में है होने वाला। योजना/आशा डीबग/रिलीज एप्लिकेशन/डीएलएल बिल्ड के सभी संयोजनों का समर्थन करना है।
जैसा कि आप पूछ सकते हैं: नहीं, मैं बूस्ट :: shared_ptr <>, std :: shared_ptr <>, std :: unique_ptr <> और जैसा कि हम डीएल उपयोगकर्ता को बढ़ावा देने का खुलासा नहीं करना चाहते हैं और हम अभी तक सी ++ 11 का समर्थन नहीं करते हैं।
क्या आपने वर्चुअल फ़ंक्शन/विरासत पर विचार किया था? – PlasmaHH
तो ... आप चाहते हैं कि हम उन सभी कंपाइलरों और प्लेटफॉर्म पर आपके लिए कोड का परीक्षण करें? –
नहीं, वह शायद यह जानना चाहता है कि किसी ने पहले से ही कुछ ऐसा किया है और/या यदि यह मानक या कंपाइलर दस्तावेज़ में कहीं और है। – Tibor