2016-08-30 10 views
6

मुझे एक छोटी सी कॉपी करने योग्य ट्यूपल-जैसी कक्षा की आवश्यकता है, लेकिन कोई उपयुक्त कार्यान्वयन मौजूद नहीं है, मैं अपने आप के साथ नहीं आ सकता था और मुझे लगता है कि कोई भी संभव नहीं हो सकता है। इसका कारण संदर्भ हैं। एक ::std::tuple संदर्भ पकड़ सकता है, लेकिन एक तुच्छता copyable टपल, करने में सक्षम नहीं हो सकता है, क्योंकि यह गैर तुच्छ कंस्ट्रक्टर्स नहीं हो सकता है और संदर्भ टपल की तरह वर्ग के निर्माताओं में प्रारंभ करना होगा और एक संदर्भ आवरण भंडारण होगा ट्यूपल-जैसी कक्षा गैर-तुच्छ। मेरे प्रश्न शीर्षक में हैं।एक मामूली प्रतिलिपि :: std :: tuple-like class टेम्पलेट संभव है? क्या एक कार्यान्वयन मौजूद है?

+0

मेरा प्रश्न :: std :: tuple को बिल्कुल संदर्भित नहीं करता है, लेकिन एक कस्टम टुपल के लिए, यह एक डुप्लिकेट नहीं है। मुझे सच में लगता है कि इस तरह के एक टुपल संभव हो सकता है। – user1095108

+0

क्या आपको संदर्भ समर्थन की आवश्यकता है? [यह कार्यान्वयन] होगा (http: // stackoverflow।कॉम/प्रश्न/38393302/रिटर्निंग-वैरिएडिक-एग्रीगेट-स्ट्रक्चर-एंड-सिंटैक्स-फॉर-सी 17-वैरिएडिक-टेम्पलेट-सी/38394375 # 38394375) मदद? कुछ फिक्सिंग के बाद –

+0

@Revolver_Ocelot हाँ। https://github.com/user1095108/generic/blob/master/many.hpp शायद अभी भी बग हैं। – user1095108

उत्तर

6

भंडारण reference_wrapper का उपयोग कर के संदर्भ entirely possible है:

std::reference_wrapper TriviallyCopyable होने की गारंटी है। (के बाद से सी ++ 17)

बस एक गैर तुच्छ गैर विशेष निर्माता (के रूप में जैसे std::reference_wrapper<T>::reference_wrapper(T&)) पूरी तरह से ठीक है हो रही है। तो आपके trivially_copyable_tuple के लिए भी यही है; जब तक यह एक छोटी प्रतिलिपि निर्माता है, trivially_copyable_tuple::trivially_copyable_tuple(int&, float&, char) ठीक है।

और वास्तव में, आप बिल्कुल std::reference_wrapper उपयोग करने की आवश्यकता नहीं है, जबकि एक संदर्भ प्रकार TriviallyCopyable नहीं है, एक वर्ग प्रकार जिसमें एक संदर्भ होता है वह स्वयं ही ट्राइवलीयॉपीबल (हालांकि यह पॉड, मानक लेआउट टाइप, डिफॉल्ट कॉन्स्ट्रक्टेबल, ट्रिविली डिफॉल्ट कॉन्स्ट्रक्टेबल, या ट्रिविअल नहीं है)।

यहाँ कुछ उदाहरण है:

  • my own tuple implementation, दिखा रहा है कि कोई विशेष चाल यह TriviallyCopyable बनाने के लिए आवश्यक कर रहे हैं;
  • एक very slightly more involved implementation दिखा रहा है कि अगर आप reseating assignability प्रदान आप अभी भी अन्य सभी गुण रक्षा कर सकते हैं (ताकि आंतरिक रूप से एक reference_wrapper -alike उपयोग करने की आवश्यकता);
  • एक tuple with through assignability दिखा कि आप तुच्छ copyability खो देते हैं, लेकिन केवल वास्तव में एक संदर्भ प्रकार युक्त tuples पर; आप स्केलर युक्त टुपल्स पर छोटी प्रतिलिपि बनाए रख सकते हैं।
+0

"* जबकि एक संदर्भ प्रकार TriviallyCopyable नहीं है, एक वर्ग प्रकार जिसमें एक संदर्भ होता है वह स्वयं ही ट्राइवलीयॉपीबल * है" यह केवल तभी सच है जब वह वर्ग स्वयं को तुलनीय रूप से कॉपी करने योग्य बनाता है। और मुझे यकीन नहीं है कि कॉपी/मूव कन्स्ट्रक्टर को हटाए बिना यह कैसे कर सकता है। –

+3

@ निकोलबोलस मानक कहां कहता है कि संदर्भ वाले वर्ग प्रकार को तुलनीय रूप से कॉपी करने योग्य नहीं है? मैं इसे [class.copy]/11-12 में नहीं ढूंढ सकता। संपादित करें: आप कॉपी असाइनमेंट के बारे में सोच नहीं रहे हैं, है ना? – ecatmur

+0

इसे कॉपी असाइनमेंट को हटाने की आवश्यकता होती है, हालांकि, यह थोड़ा कम उपयोगी बनाता है। (बेशक, विकल्प शोध कर रहा है; आप असाइनमेंट ऑपरेटर को गैर-तुच्छ बनाने के बिना संदर्भ के माध्यम से असाइन नहीं कर सकते हैं।) –

6

यह स्पष्ट नहीं है कि तुम क्या जब आप संदर्भ चर्चा करने के लिए बात कर रहे हैं।

हाँ, यदि किसी विशेष टपल संदर्भ प्रकार संग्रहीत है, तो यह तुच्छता copyable होगा। लेकिन यह किसी भी प्रकार के लिए सच है। यदि कोई प्रकार त्रिकोणीय रूप से प्रतिलिपि नहीं है, तो एक प्रकार जिसमें उपरोक्त के रूप में उस प्रकार को शामिल किया गया है, वह भी तुलनीय रूप से प्रतिलिपि नहीं होगा।

आप एक tuple नहीं लिख सकते हैं जो उन प्रकारों पर छोटी प्रतिलिपिता लागू करता है जो स्वयं को तुलनीय रूप से प्रतिलिपि नहीं बनाते हैं।

लेकिन अन्यथा, यह एक ट्यूपल प्रकार लिखने के लिए entirely possible है जो छोटे-छोटे प्रतिलिपि बनाने योग्य होते हैं यदि सभी घटक प्रकार स्वयं को तुलनीय रूप से कॉपी करने योग्य होते हैं। यह सबसे अच्छी गारंटी है जिसे आप प्राप्त करने जा रहे हैं। और यदि आप यह सुनिश्चित करना चाहते हैं कि उपयोगकर्ता कभी-कभी गैर-तुलनीय प्रतिलिपि प्रकार न दें, तो आप हमेशा static_assert जोड़ सकते हैं कि टाइपलिस्ट में सभी प्रकारों को तुलनीय रूप से कॉपी करने योग्य हैं।

+0

संदर्भ वाले एक tuple (तार्किक रूप से) संदर्भों (भौतिक रूप से) स्टोर की जरूरत नहीं है। उदाहरण के लिए, इसमें पॉइंटर्स हो सकते हैं, और संदर्भों का पर्दाफाश कर सकते हैं। – Yakk

+0

@ मेरे विचार बिल्कुल ठीक है। – user1095108

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