मुझे एक छोटी सी कॉपी करने योग्य ट्यूपल-जैसी कक्षा की आवश्यकता है, लेकिन कोई उपयुक्त कार्यान्वयन मौजूद नहीं है, मैं अपने आप के साथ नहीं आ सकता था और मुझे लगता है कि कोई भी संभव नहीं हो सकता है। इसका कारण संदर्भ हैं। एक ::std::tuple
संदर्भ पकड़ सकता है, लेकिन एक तुच्छता copyable टपल, करने में सक्षम नहीं हो सकता है, क्योंकि यह गैर तुच्छ कंस्ट्रक्टर्स नहीं हो सकता है और संदर्भ टपल की तरह वर्ग के निर्माताओं में प्रारंभ करना होगा और एक संदर्भ आवरण भंडारण होगा ट्यूपल-जैसी कक्षा गैर-तुच्छ। मेरे प्रश्न शीर्षक में हैं।एक मामूली प्रतिलिपि :: std :: tuple-like class टेम्पलेट संभव है? क्या एक कार्यान्वयन मौजूद है?
उत्तर
भंडारण 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 पर; आप स्केलर युक्त टुपल्स पर छोटी प्रतिलिपि बनाए रख सकते हैं।
"* जबकि एक संदर्भ प्रकार TriviallyCopyable नहीं है, एक वर्ग प्रकार जिसमें एक संदर्भ होता है वह स्वयं ही ट्राइवलीयॉपीबल * है" यह केवल तभी सच है जब वह वर्ग स्वयं को तुलनीय रूप से कॉपी करने योग्य बनाता है। और मुझे यकीन नहीं है कि कॉपी/मूव कन्स्ट्रक्टर को हटाए बिना यह कैसे कर सकता है। –
@ निकोलबोलस मानक कहां कहता है कि संदर्भ वाले वर्ग प्रकार को तुलनीय रूप से कॉपी करने योग्य नहीं है? मैं इसे [class.copy]/11-12 में नहीं ढूंढ सकता। संपादित करें: आप कॉपी असाइनमेंट के बारे में सोच नहीं रहे हैं, है ना? – ecatmur
इसे कॉपी असाइनमेंट को हटाने की आवश्यकता होती है, हालांकि, यह थोड़ा कम उपयोगी बनाता है। (बेशक, विकल्प शोध कर रहा है; आप असाइनमेंट ऑपरेटर को गैर-तुच्छ बनाने के बिना संदर्भ के माध्यम से असाइन नहीं कर सकते हैं।) –
यह स्पष्ट नहीं है कि तुम क्या जब आप संदर्भ चर्चा करने के लिए बात कर रहे हैं।
हाँ, यदि किसी विशेष टपल संदर्भ प्रकार संग्रहीत है, तो यह तुच्छता copyable होगा। लेकिन यह किसी भी प्रकार के लिए सच है। यदि कोई प्रकार त्रिकोणीय रूप से प्रतिलिपि नहीं है, तो एक प्रकार जिसमें उपरोक्त के रूप में उस प्रकार को शामिल किया गया है, वह भी तुलनीय रूप से प्रतिलिपि नहीं होगा।
आप एक tuple नहीं लिख सकते हैं जो उन प्रकारों पर छोटी प्रतिलिपिता लागू करता है जो स्वयं को तुलनीय रूप से प्रतिलिपि नहीं बनाते हैं।
लेकिन अन्यथा, यह एक ट्यूपल प्रकार लिखने के लिए entirely possible है जो छोटे-छोटे प्रतिलिपि बनाने योग्य होते हैं यदि सभी घटक प्रकार स्वयं को तुलनीय रूप से कॉपी करने योग्य होते हैं। यह सबसे अच्छी गारंटी है जिसे आप प्राप्त करने जा रहे हैं। और यदि आप यह सुनिश्चित करना चाहते हैं कि उपयोगकर्ता कभी-कभी गैर-तुलनीय प्रतिलिपि प्रकार न दें, तो आप हमेशा static_assert
जोड़ सकते हैं कि टाइपलिस्ट में सभी प्रकारों को तुलनीय रूप से कॉपी करने योग्य हैं।
संदर्भ वाले एक tuple (तार्किक रूप से) संदर्भों (भौतिक रूप से) स्टोर की जरूरत नहीं है। उदाहरण के लिए, इसमें पॉइंटर्स हो सकते हैं, और संदर्भों का पर्दाफाश कर सकते हैं। – Yakk
@ मेरे विचार बिल्कुल ठीक है। – user1095108
- 1. क्या एक शब्दकोश "टेम्पलेट" बनाना संभव है?
- 2. क्या एक गैर रिकर्सिव at_c कार्यान्वयन संभव है?
- 3. जावा में एक हैंडलबर्स.जेएस कार्यान्वयन मौजूद है?
- 4. क्या भाषा संबंध पर एक टेम्पलेट विशेषज्ञ करना संभव है?
- 5. चेक अगर एक विधि का एक टेम्पलेट विशेषज्ञता मौजूद है
- 6. क्या std :: function का एक स्टैंडअलोन कार्यान्वयन है?
- 7. क्या एक सेट करने योग्य nthcdr कार्यान्वयन मौजूद है?
- 8. सी ++ वर्ग टेम्पलेट एक टेम्पलेट है: टेम्पलेट तर्क अमान्य है
- 9. क्या std :: string और std :: wstring के लिए एक फ़ंक्शन लिखना संभव है?
- 10. क्या एक लिबसी मौजूद है?
- 11. सुनिश्चित करें कि टेम्पलेट पैरामीटर एक enum class
- 12. यह संभव एक टेम्पलेट
- 13. संभव है एक अलग इकाई
- 14. क्या टेम्पलेट उपनाम बनाना संभव है?
- 15. एक प्रतिलिपि बनाकर std :: स्ट्रिंग से स्ट्रीम?
- 16. एक मामूली स्केलेबल रास्ता
- 17. कक्षा 'एक टेम्पलेट प्रकार नहीं है'
- 18. क्या एक गैर-चलने योग्य, गैर-प्रतिलिपि प्रकार का उदाहरण वापस करना संभव है?
- 19. क्या SqlCommand.Clone() एक गहरी प्रतिलिपि या उथली प्रतिलिपि बनाता है?
- 20. सी ++: टेम्पलेट <class> का क्या अर्थ है?
- 21. क्या एसटीएल कंटेनर पास करना एक प्रतिलिपि बनाता है?
- 22. एक प्रतिलिपि के बिना एक C++ std :: वेक्टर लौट रहा है?
- 23. एचटीएमएल टेम्पलेट मौजूद नहीं है
- 24. क्या एडा का एक मुफ्त कार्यान्वयन है?
- 25. क्या सी ++ या पुस्तकालयों में एक शून्य std :: ostream कार्यान्वयन है?
- 26. क्या यह संभव है (अनुशंसित) एक शुद्ध एपीआई-प्रोजेक्ट है जो वास्तविक कार्यान्वयन से अलग है?
- 27. क्या एक WPF माउसओवर संभव है?
- 28. क्या निश्चित आकार आवंटक का एक सुरुचिपूर्ण सी ++ कार्यान्वयन है?
- 29. क्या एक अद्यतन 'vimtutor' मौजूद है?
- 30. क्या एक आर संकलक मौजूद है?
मेरा प्रश्न :: std :: tuple को बिल्कुल संदर्भित नहीं करता है, लेकिन एक कस्टम टुपल के लिए, यह एक डुप्लिकेट नहीं है। मुझे सच में लगता है कि इस तरह के एक टुपल संभव हो सकता है। – user1095108
क्या आपको संदर्भ समर्थन की आवश्यकता है? [यह कार्यान्वयन] होगा (http: // stackoverflow।कॉम/प्रश्न/38393302/रिटर्निंग-वैरिएडिक-एग्रीगेट-स्ट्रक्चर-एंड-सिंटैक्स-फॉर-सी 17-वैरिएडिक-टेम्पलेट-सी/38394375 # 38394375) मदद? कुछ फिक्सिंग के बाद –
@Revolver_Ocelot हाँ। https://github.com/user1095108/generic/blob/master/many.hpp शायद अभी भी बग हैं। – user1095108