2012-05-11 15 views
8

std::allocator के construct और destroy सदस्य कार्यों के निर्माण के लिए तत्व के प्रकार के पैरामिट्रीकृत हैं:std :: आवंटक :: निर्माण और std :: आवंटक :: तत्व प्रकार पर templated नष्ट क्यों हैं?

template<class T> 
    class allocator 
{ 
    public: 
    typedef T value_type; 
    typedef T* pointer; 

    template<class U, class... Args> 
     void construct(U *p, Args&&... args); 

    template<class U> 
     void destroy(U *p); 

    ... 
}; 

इस के लिए तर्क क्या है? वे value_type* या pointer क्यों नहीं लेते हैं? ऐसा लगता है कि allocator<T> को केवल T प्रकार की वस्तुओं को बनाने या नष्ट करने के बारे में पता होना चाहिए।

उत्तर

16

इसी कारण से allocator एस rebind<U> टाइपपीफ होना आवश्यक है: क्योंकि कई कंटेनर T एस आवंटित नहीं करते हैं।

लिंक की गई सूचियां लें। ये नोड्स आवंटित करते हैं, जिनमें से प्रत्येक में एक सदस्य के रूप में T शामिल है। तो allocator एस को उस प्रकार को आवंटित करने में सक्षम होना आवश्यक है जिसे वे नहीं जानते (rebind<U> के माध्यम से)। हालांकि, इसके लिए एक प्रतिलिपि ऑपरेशन की आवश्यकता होती है: इसे rebind<U>::other प्रकार का नया आवंटक बनाने की आवश्यकता होती है।

जब संभव हो तो इससे बचने के लिए बेहतर है। इसलिए, निर्माण और विनाश के लिए, आवंटकों को किसी भी प्रकार के उचित संचालन करने की आवश्यकता होती है, जैसे कि लिंक्ड सूची के आंतरिक नोड प्रकार। इससे लिंक किए गए सूची के आंतरिक नोड प्रकार के लिए Allocator::construct/destruct मित्र कार्यों के रूप में भी संभव हो जाता है।

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