2011-08-02 22 views
66

मुझे typedeftemplate class कैसे चाहिए? कुछ की तरह:टेम्पलेट क्लास टाइप कैसे करें?

typedef std::vector myVector; // <--- compiler error 

मैं 2 तरीके के बारे में पता:

(1) #define myVector std::vector // not so good 
(2) template<typename T> 
    struct myVector { typedef std::vector<T> type; }; // verbose 

हम C++ 0x में कुछ भी बेहतर है?

+0

आप इसे क्यों चाहते हैं? उपयोग का मामला क्या है? –

+2

मैं कुछ कार्यान्वित कर रहा हूं जहां मेरे पास कुछ 'टेम्पलेट क्लास' शामिल है। प्रारंभ में, मैं इसे मानक कक्षाओं के साथ लागू कर दूंगा, मैं अपने कस्टम वर्गों में जाना चाहता हूं। तो मैं चाहता हूं कि स्विच 'टाइपपीफ' को बदलने के समान सरल होना चाहिए। – iammilind

+0

मुझे डेविड से सहमत होना है। आप इसे उपनाम क्यों करना चाहते हैं? अप्रत्याशित और गैर-रखरखाव कोड के लिए संकेतक अग्रणी कारण है। हालांकि आपने एक अच्छा कारण दिया, "एब्स्ट्रक्शन"। एसएलएल के साथ समस्या एपीआई है। यह विशिष्ट अनुकूलन को रोकता है। और एक ही एपीआई रखने और सोचने से आप बेहतर कर सकते हैं बीमार है। अपने खुद के बढ़ने योग्य सरणी लिखने में पूरा दिन नहीं लगता है। बस करो और इसके साथ किया जाना चाहिए। या बस एसटीएल का उपयोग करें और अपने जीवन के साथ आगे बढ़ें। – Dan

उत्तर

108

हां। इसे "alias template" कहा जाता है, और यह सी ++ 11 में एक नई सुविधा है।

template<typename T> 
using MyVector = std::vector<T, MyCustomAllocator<T>>; 

प्रयोग तो बिल्कुल होगा आपकी अपेक्षा के अनुसार:

MyVector<int> x; // same as: std::vector<int, MyCustomAllocator<int>> 

जीसीसी 4.7 के बाद से यह समर्थन किया है और बजना 3.0 के बाद से यह है।

+0

यह अच्छा है, लेकिन मैं इसे अपने gcc4.6 या 4.5 (http://www.ideone.com/I8kbA) से सत्यापित करने में सक्षम नहीं हूं। क्या आप एमएसवीसी के साथ संकलित कर रहे हैं? – iammilind

+0

आपको सी ++ 0x पहले स्वीकार करने की प्रतीक्षा करनी होगी। फिर आपको मानक को लागू करने के लिए कंपाइलर लेखकों के लिए इंतजार करना होगा। –

+1

"पकड़ यह है कि कोई भी इसका समर्थन नहीं करता है।" यह कुछ महीनों के बाद क्लैंग (एसवीएन ट्रंक) में है। –

14

सी ++ 03 में आप ऐसा करने के लिए कक्षा (सार्वजनिक रूप से या निजी तौर पर) से उत्तराधिकारी हो सकते हैं।

template <typename T> 
class MyVector : public std::vector<T, MyCustomAllocator<T> > {}; 

आप में कुछ अधिक परिश्रम करने की जरूरत है (विशेष रूप से,, कॉपी कंस्ट्रक्टर्स असाइनमेंट ऑपरेटरों), लेकिन यह काफी संभव है।

+2

@iammilind: डाउनवॉट्स से बचाने के बजाए एक अपवित्रता उन्हें और अधिक संभावित बनाता है (* इस सवाल को कैसे बढ़ाया जा सकता है! * तर्क का प्रकार)। मैं उन लोगों में से एक हूं जो एसटीएल कंटेनरों से विरासत में खुलेआम हैं ... लेकिन इस मामले में ऐसे कई विकल्प नहीं हैं। मुझे लगता है कि सबसे अच्छा विकल्प पुनर्विचार कर रहा है कि आप इसे पहले स्थान पर क्यों करना चाहते हैं ... –

+0

@ डेविड रोड्रिगेज इस बात पर सहमत हुए कि आप क्यों चाहेंगे। यदि आप अन्य आवंटकों के आधार पर वैक्टर का भारी उपयोग करते हैं, तो टेम्पलेट टाइपपीफ का बहुत स्वागत होता। हालांकि निजी विरासत (यानी, कार्यान्वित-इन-टर्म) मेरे द्वारा ठीक है, लेकिन केवल तभी प्राप्त होने का कोई कारण है ... जो आमतौर पर नहीं होता है। – dascandy

+0

शायद std :: vector के लिए नहीं, लेकिन आम तौर पर मैं देख सकता हूं कि यह कैसे आसान हो सकता है। मान लें कि आपके पास एक प्रकार है जैसे LongName (या नेस्टेड टेम्पलेट्स की एक लंबी श्रृंखला); तो शॉर्टकट नाम होने से आसान हो सकता है। यदि आप इस प्रकार का उपयोग एक या दो अलग-अलग टी के लिए करते हैं, तो आप उन्हें टाइप कर सकते हैं।लेकिन यदि आपके पास कई प्रकार के टी हैं, तो टाइपिफ़ को उन सभी को सीधे नाम का उपयोग करने तक ही हो सकता है, और फिर भी नाम का उपयोग दर्दनाक रूप से लंबा है। – bartgol

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