2011-02-14 11 views
8

यह जांचने के लिए कि C++ प्रकार को छोटा रूप से कॉपी करने योग्य है या नहीं? मेरे पास एक वर्ग है, जो निर्दिष्ट टेम्पलेट प्रकार टी के साथ memcpy और memcmp फ़ंक्शंस का उपयोग करता है और मैं प्रकारों के लिए जोर देना चाहता हूं, जो memcpy के साथ प्रतिलिपि करने के लिए सुरक्षित नहीं हैं। क्या ऐसा करने का कोई तरीका है (मौजूदा मानक के साथ)?सी ++ is_trivially_copyable चेक

+2

आप 'is_pod' प्रकार विशेषता का उपयोग करने में सक्षम हो सकते हैं। "Memcpy' के साथ कॉपी करने के लिए सुरक्षित" की आपकी परिभाषा क्या है? यदि किसी ऑब्जेक्ट में पॉइंटर डेटा सदस्य होता है जो किसी स्वामित्व वाली गतिशील आवंटित ऑब्जेक्ट को इंगित करता है, तो वह "memcpy' के साथ कॉपी करने के लिए सुरक्षित है"? –

+0

@ जेम्स: परिभाषा है, छोटी प्रतिलिपि निर्माता - यानी, इस प्रकार के उपयोगकर्ता द्वारा परिभाषित प्रतिलिपि बनाने वाला नहीं है, न ही किसी भी बेस क्लास या डेटा सदस्य। – Puppy

+1

मानक से परिभाषा "एक छोटी प्रतिलिपि योग्य वर्ग एक कक्षा है जो: - इसमें कोई गैर-तुच्छ प्रतिलिपि बनाने वाले निर्माता (12.8), नहीं हैं - इसमें कोई गैर-तुच्छ प्रतिलिपि ऑपरेटर (13.5.3, 12.8), है - इसमें कोई है तुच्छ विनाशक (12.4)। " – axe

उत्तर

8

नहीं, सी ++ 98/सी ++ 03 में संभव नहीं है। इस तरह की चीजें हैं क्यों <type_traits> सी ++ 0x में जोड़ा गया था। <type_traits> की कुछ विशेषताओं को सी ++ 03 में लागू किया जा सकता है, अक्सर एसएफआईएनएई सिद्धांत का उपयोग करते हुए, लेकिन std::is_trivially_copyable<T> समेत कई, को केवल अंतर्निहित कंपाइलर समर्थन की आवश्यकता होगी।

+0

हां, यह भी मेरी छाप थी। धन्यवाद। – axe

4

सबसे नज़दीकी बात boost::is_pod<> है।

+0

हालांकि, यह वर्ग प्रकारों के लिए "बस काम नहीं करता" है। – ThomasMcLeod

6

बढ़ावा देने के लिए इस प्रकार के प्रकार उपलब्ध हैं।

हालांकि, आप अपना समय बर्बाद कर रहे हैं- एक प्रकार का memcpying आपके ऑप्टिमाइज़र एक कॉपी कन्स्ट्रक्टर के साथ उत्पादित करेगा जितना तेज़ trivially कॉपी करने योग्य है। बस कॉपी कन्स्ट्रक्टर का उपयोग करें।

+0

अच्छा बिंदु। (अधिक वर्ण) – aschepler

+0

किस प्रकार के लक्षण? is_pod ठीक वही नहीं है जिसे मैं ढूंढ रहा हूं, क्योंकि मैक्सिम ने इंगित किया है कि यह लगभग समान है। – axe

+0

_ हालांकि, आप अपना समय बर्बाद कर रहे हैं- एक प्रकार का memcpying आपके ऑप्टिमाइज़र एक कॉपी कन्स्ट्रक्टर के साथ उत्पादित करेगा जितना तेज़ रूप से कॉपी करने योग्य है। बस कॉपी कन्स्ट्रक्टर का उपयोग करें। मैं प्रदर्शन के लिए नहीं हूं, मैं नहीं चाहता कि मेरी कक्षा गैर-तुच्छ प्रतिलिपि बनाने वाले प्रकार के प्रकारों के लिए काम करे। मैं इसे सभी अभिन्न प्रकारों के लिए विशेषज्ञ बना सकता हूं, हालांकि यह पीओडी के लिए काम नहीं करेगा। – axe

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