2010-10-28 25 views
17

मैं जानना चाहता हूं कि सी ++ 0x के लिए मानक लाइब्रेरी में टुपल कैसे कार्यान्वित किया जाता है। मैंने description in libstdc++ manual पढ़ने की कोशिश की और फिर template listing पढ़ा, लेकिन यह समझना वाकई मुश्किल है कि यह कैसे काम करता है, खासकर कोड पढ़ने पर।std :: tuple कैसे कार्यान्वित किया जाता है?

क्या कोई मुझे कुछ वाक्यों में टुपल कार्यान्वयन के विचार की व्याख्या कर सकता है? मैं यह जानना चाहता हूं, क्योंकि मैं अपने कोड में टुपल्स का उपयोग करने के बारे में सोच रहा हूं और मैं समझना चाहता हूं कि यह कैसे काम करता है और यह किस प्रकार का ओवरहेड लाता है (केवल संकलन समय बढ़ाता है, स्मृति पर कई प्रतिलिपि संचालन करता है, कन्स्ट्रक्टर में कई अन्य फ़ंक्शन निष्पादित करता है , आदि।)।

उत्तर

23

ट्यूपल्स को लागू करने के लिए एक दृष्टिकोण एकाधिक विरासत का उपयोग कर रहा है। ट्यूपल-तत्व पत्ते-वर्गों द्वारा आयोजित किए जाते हैं, और ट्यूपल वर्ग स्वयं कई पत्तियों से प्राप्त होता है। छद्म कोड में:

template<typename T0, typename T1, ..., typename Tn> 
class PseudoTuple : TupleLeaf<0, T0>, TupleLeaf<1, T1>, ..., TupleLeaf<n, Tn> { 
    ... 
}; 

प्रत्येक पत्ती ताकि प्रत्येक आधार स्तरीय अद्वितीय भले ही प्रकार उनमें शामिल समान हैं हो जाता है, एक सूचकांक है, तो हम एक सरल static_cast साथ वें तत्व पहुंच सकता है:

static_cast<TupleLeaf<0, T0>*>(this); 
// ... 
static_cast<TupleLeaf<n, Tn>*>(this); 

मैं इस "फ्लैट" टपल कार्यान्वयन के बारे में यहाँ एक विस्तृत विवरण ऊपर लिखा है: C++11 tuple implementation details (Part 1)

+0

हां यह एक महान स्पष्टीकरण है! दुर्भाग्यवश, ऐसा नहीं है कि tuple libstdC++ में लागू किया गया है, जो कि रिकर्सिव कार्यान्वयन के लिए चिपक जाता है। एक अधिक व्यापक रूप से वितरित libC++ के लिए इंतजार कर सकते हैं! –

+0

गैर-पुनरावर्ती कार्यान्वयन का संक्षेप में वर्णन करना उपयोगी हो सकता है। –

+1

@KyleStrand erm, यह _is_ गैर-पुनरावर्ती कार्यान्वयन (टी: एल 1, एल 2, एल 3 बनाम टी: एल 1: एल 2: पुनरावर्तक कार्यान्वयन के एल 3) – mitchnull

2

लागू std::tuplevariadic templates के माध्यम से संभव है, जो कोर भाषा में पेश किए गए थे।

मुझे पता है कि यह सवाल पूछताछ कर रहा है लेकिन यह आपको शोध के लिए एक बेहतर खोज वाक्यांश देता है।

+2

इसके अलावा, कार्यान्वयन है * * तुच्छ नहीं, वास्तव ओपी की कोशिश कर रहा है और समझने में नाकाम रहने उल्लेख किया है कि इसका सबूत के रूप में यह री द्वारा एक उदाहरण कार्यान्वयन के कोड डिंग। –

+2

इस उत्तर पर चर्चा की जा रही है [मेटा पर] (http://meta.stackoverflow.com/questions/290254/for-the-question-how-is-x-implemented-is-its-trivial-using-feature-y -एक-एक)। – Daedalus

+1

@KyleStrand ओपी ने 2010 में कोड पढ़ा था जब विविध टेम्पलेट्स को अभी तक समझा नहीं गया था। मैंने उन्हें विविध टेम्पलेट्स को समझने के लिए उपकरण दिए। मैं इसे एक उत्तर मानता हूं। – Motti

10

एक ट्यूपल आम तौर पर एक संकलित समय लिंक-सूची के रूप में लागू किया जाता है।

कोड थोड़ा टेम्पलेट वाक्य रचना के माध्यम से समझ से परे है, लेकिन निम्न तत्वों सामान्य रूप से मौजूद हैं:

  1. सिर और पूंछ तत्वों के साथ वर्गों की एक श्रृंखला (विपक्ष-तत्व) तक
  2. एक खाली पूंछ उदाहरण सूची का अंत इंगित करें।
  3. पुनरावर्ती टेम्पलेट-तत्काल (संकलन समय पर तत्काल) के रूप में लागू एक निश्चित अनुक्रमणिका में सूची को चलाने के लिए रिकर्सिव कोड।

सी ++ 03 (उदा। बूस्ट) में उचित कार्यान्वयन मौजूद हैं।

वैरैडिक टेम्पलेट्स मोटी द्वारा वर्णित तत्वों की असीमित संख्या की अनुमति देता है।

लागत आमतौर पर एक संकलन समय-एक है। प्रतिलिपि बनाने के दौरान रचनाकारों को कॉपी किया जा सकता है (अधिकतम 1), और जब tuples खुद को कॉपी करते हैं।

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