2010-10-18 12 views
9

सी ++ एसटीएल पूरी तरह से सार आधार वर्ग (उर्फ इंटरफेस) का उपयोग अक्सर प्रतीत नहीं होता है। मुझे पता है कि अधिकांश चीजें एसटीएल एल्गोरिदम या चालाक टेम्पलेट मेटाप्रोग्रामिंग के साथ हासिल की जा सकती हैं।एसटीएल में कोई "इटेबल" इंटरफ़ेस क्यों नहीं है?

लेकिन फिर भी, कुछ उपयोग मामलों के लिए (उदाहरण के लिए, एक एपीआई में, अगर मैं कंटेनर के प्रकार के बारे में विशिष्ट नहीं होना चाहता हूं, तो बस इसमें शामिल तत्वों के बारे में), निम्न रूप का एक इंटरफ़ेस होगा अच्छा: एसटीएल कंटेनर गैर आभासी समारोह के रूप में इस वर्ग को लागू

template<typename T> struct forward_iterable { 
    struct iterator { 
     typedef T value_type; 
     typedef T& reference; 
     typedef T* pointer; 
     virtual reference operator*() const = 0; 
     virtual pointer operator->() const = 0; 
     virtual bool operator==(const iterator&) const = 0; 
     virtual bool operator!=(const iterator&) const = 0; 
     virtual operator const_iterator() const = 0; 
     virtual iterator& operator++() = 0; 
     virtual iterator operator++(int) = 0; 
    }; 
    struct const_iterator { ... }; // similar, but with const references 

    virtual iterator begin() = 0; 
    virtual const_iterator begin() const = 0; 
    virtual iterator end() = 0; 
    virtual const_iterator end() const = 0; 
}; 

हैं, तो यह, मेरी राय में, प्रदर्शन को प्रभावित नहीं होगा (अगर मैं इस इंटरफेस के माध्यम से सीधे और नहीं कंटेनर का उपयोग)। तो एसटीएल में इतने कम "इंटरफेस" क्यों हैं? या मैं बस "जावा" शब्दों में बहुत ज्यादा सोच रहा हूँ?

+0

हम्म, मैंने बस एक जटिलता के बारे में सोचा: तुलना ऑपरेटर की सामान्य प्रकृति के कारण गतिशील प्रकार की जांच की आवश्यकता होगी ताकि यह सुनिश्चित किया जा सके कि इटरेटर "संगत" हैं। क्या यही कारण है कि यह काम नहीं करता है? – summentier

उत्तर

6

एसटीएल (जो मानक पुस्तकालय का सबसेट है) ओओपी (रनटाइम पॉलिमॉर्फिज्म में) का उपयोग नहीं करता है और यह डिज़ाइन द्वारा किया जाता है।

आपके डिज़ाइन के साथ, मूल्य से इटरेटर को वापस करने में समस्या नहीं होगी (कॉन्वर्सिस मूल्य प्रकारों के लिए काम नहीं करता है)? यही है, अनिवार्य रूप से पूरी बात को स्थिर सदस्यों (जिसे आप संदर्भ द्वारा वापस कर सकते हैं) या ढेर-आवंटित इटरेटर्स पर भरोसा करना चाहते हैं? बाद में गैर-कचरा-एकत्रित भाषा में अजीब लग रहा था।

क्या तुम सिर्फ बढ़ावा के function और any प्रकार की तरह का वर्णन कर रहे हैं (एक इटरेटर मान प्रकार पर टेम्प्लेट की गई) एक तकनीक प्रकार विलोपन कहा जाता है का उपयोग कर प्राप्त किया जा सकता है (और तुम वहाँ बाहर any_iterator कार्यान्वयन पा सकते हैं)।

मूल विचार है:

//less templated interface 
template <class T> 
class any_iterator_base 
{ 
    virtual void increment() = 0; 
    /*...*/ 
}; 

//derived class templated on iterator type 
template <class Iter, class T> 
class any_iterator_impl: public any_iterator_base<T> 
{ 
    Iter it; 
    virtual void increment() { ++it; } 
    /*...*/ 
}; 

//and a class for the user which makes it all act like a regular value type 
template <class T> 
class any_iterator 
{ 
    shared_ptr<any_iterator_base<T> > it; 
public: 
    template <class Iter> 
    any_iterator(Iter iterator): it(new any_iterator_impl<Iter, T>(iterator)) {} 
    any_iterator& operator++() { it->increment(); return *this; } 
    //... 
}; 

int main() 
{ 
     std::vector<int> vec; 
     any_iterator<int> it = vec.begin(); 
     //... 
} 

यह (है कि तुलना में अधिक जटिल हो सकता है जैसे का वर्णन और इटरेटर श्रेणी लागू करने ?, कैसे दो any_iterators की तुलना के बारे में कुछ करने की जरूरत है काम (डबल प्रेषण/RTTI))।

2

एसटीएल में बहुत सारे "इंटरफ़ेस" -स्टाइल सार आधार वर्गों को देखने का कारण यह नहीं है क्योंकि यह सी ++ टेम्पलेट्स पर इतनी भारी निर्भर करता है। जब आप सी ++ टेम्पलेट्स का उपयोग करते हैं, तो किसी भी वर्ग को बहुत अधिक, कोई फर्क नहीं पड़ता कि उसका माता-पिता क्या हो सकता है, तब तक यह तब तक करेगा जब तक कि टेम्पलेट उपयोग करने की कोशिश करने वाली सभी विधियों का समर्थन करता है।

एक अंतर्निहित इंटरफ़ेस है, लेकिन वास्तव में इसे लिखना अनैतिक है। मेरे अपने कोडिंग में मैं वैसे भी लिखता हूं, बस उपयोगकर्ता की सुविधा के रूप में, लेकिन ऐसा नहीं है कि एसटीएल लेखकों ने कैसे रोल किया।

0

एसटीएल संरचनाओं को विरासत में दिमाग में परिभाषित नहीं किया गया है। किसी भी एसएलएल संग्रह subclassing के लिए एक अच्छा मामला बनाना आसान नहीं है। इस बात को ध्यान में रखते हुए, एसएलएल आपको किसी भी कीमत का भुगतान नहीं करता है जो सामान्य वर्ग विरासत से जुड़ा हुआ हो सकता है। यदि आभासी तरीकों का उपयोग किया जाना था, तो वे अनुकूलक द्वारा रेखांकित नहीं किया जा सका।

इसके अलावा, एसटीएल ऐसी चीजों के साथ संगत होना चाहता है जो शायद शीर्ष स्तर के अमूर्त बेस क्लास, जैसे सरणी से प्राप्त नहीं हो सके।

+0

मुझे लगता है कि वर्चुअल विधियों के गैर वर्चुअल स्पेशलाइजेशन को वास्तव में रेखांकित किया जा सकता है यदि सबक्लास विधि को सीधे (और बेस क्लास के माध्यम से नहीं) कहा जाता है, इसलिए इंटरफ़ेस जोड़ना केवल आवश्यक दंड जोड़ता है। – summentier

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