2012-02-16 13 views
19

मुझे यहां पर जानबूझकर व्यक्तिपरक प्रश्न पूछने से नफरत है, लेकिन मेरे पास यह पूछने के लिए कोई और नहीं है ...सी ++: ऑटो, या टाइपपीफ का उपयोग करें?

मैं और अधिक अपनाने के द्वारा अपनी टीम में "उदाहरण के आधार पर" करने की कोशिश कर रहा हूं मैं लिखता हूं नए कोड में आधुनिक सी ++ अवधारणाओं। मेरे सहकर्मियों टेम्पलेट्स का एक सा शर्मीली है, और टाइप करने के बारे में शिकायत कर रहे हैं unique_ptr<Foobar> या सिर्फ Foobar* के बजाय shared_ptr<Foobar> जब मैं हाल ही में बना लिया है कुछ वर्गों (कारखाना तरीकों लौट unique_ptr रों और मैं shared_ptr का उपयोग कर वैक्टर में इन वस्तुओं की सूची की दुकान) का उपयोग।

उन्होंने मेरी बांह को मोड़ दिया और मुझे टाइप करने के लिए कुछ आसान टाइप करने के लिए आश्वस्त किया, उदाहरण के लिए FoobarUniquePtr

लेकिन अब मैं इन टाइपिफ के साथ कॉन्स्ट-शुद्धता की गड़बड़ी में हूं। मुझे प्रत्येक कॉन्स और गैर कॉन्स प्रकार के लिए अतिरिक्त टाइपपीफ परिभाषित करना होगा, और const const_FoobarUniquePtr कॉन्स अर्थशास्त्र को उचित रूप से व्यक्त नहीं करता है।

तो, मेरे प्रश्न के लिए, क्या इन टाइपपीफ का उपयोग करना बंद करना और इसके बजाय मेरे टीम के साथी पर auto को फेंकना होगा जब वे टेम्पलेट किए गए स्मार्ट पॉइंटर्स टाइप करने के बारे में शिकायत करते हैं? मैं अन्य विकल्पों के लिए भी खुला हूं।

+8

+1 अपने सहकर्मियों को अधिक आधुनिक प्रथाओं का उपयोग करने के लिए प्रयास करने के लिए +1! – Nick

+0

तो 'unique_ptr ' या 'const unique_ptr ' के साथ समस्या है? – Useless

+0

लगता है जैसे ऑटो इस प्रकार की चीज़ के लिए बनाया गया था। यह एक अच्छा शॉर्टकट है जो आपको वैरिएबल के लिए उपयोग करने के लिए बिल्कुल किस प्रकार की आवश्यकता है, यह पता लगाने के बजाय ऑटो डाल सकता है। जब आप पूछते हैं कि क्या यह समझ में आता है, ठीक है, भाषा मानक का उसका हिस्सा और इस तरह से इसका उपयोग करने से मुझे 'सही' लगता है। लेकिन निश्चित रूप से कुछ व्यक्तिगत वरीयताएं इसमें आ सकती हैं क्योंकि मुझे लगता है कि कुछ लोग तर्क दे सकते हैं कि वे स्पष्ट रूप से कहीं भी इस्तेमाल किए गए स्पष्ट प्रकार को देखेंगे और ऑटो पर भरोसा नहीं करेंगे। लेकिन व्यक्तिगत वरीयता से परे, यह एक वैध उपयोग की तरह लगता है। – Nerdtron

उत्तर

15

सामान्य रूप से, ऑटो आपके जीवन को बहुत आसान बनाता है।

यदि आप किसी भी गूढ़ आर्किटेक्चर पर शिपिंग नहीं कर रहे हैं (और जल्द ही ऐसा करने की कोई योजना नहीं है), तो जवाब "जब भी आप कर सकते हैं ऑटो का उपयोग" होना चाहिए।

+0

यह हमेशा अच्छी सलाह नहीं है (हालांकि यह भी इस टिप्पणी पर लागू होता है)। कभी-कभी प्रोग्रामर इरादा छुपाया जा सकता है, या दुर्लभ मामलों में कुछ अप्रत्याशित हो सकता है, और यदि आप एक बुरा-कंपाइलर-त्रुटि-संदेश-कंपाइलर जैसे जीसीसी या एमएसवीसी का उपयोग कर रहे हैं तो ट्रैक करना मुश्किल हो सकता है। – rubenvb

+0

@ रूबेनब मैं सहमत हूं। हाल ही में हर्ब सटर ने गोइंगनेटिव 2012 में अपने मुख्य नोट में घोषित किया कि जब हम टाइप रूपांतरण करना चाहते हैं तो हमें हमेशा 'ऑटो' का उपयोग करना चाहिए। मुझे आशा है कि वह जानबूझकर सनसनीखेज हो रहा है। अभी के लिए, मैं केवल एसटीएल इटरेटर्स जैसी चीजों के लिए ऑटो का उपयोग कर रहा हूं, जहां कोई वास्तव में इस बात की परवाह नहीं करता कि किस प्रकार का है और हर कोई पहले से ही जानता है कि यह वैसे भी होगा। यदि विधि का नाम स्वयं प्रकार के व्यवहार/इरादे को व्यक्त करता है (विशेष रूप से यदि रिटर्न प्रकार टेम्पलेट पैरामीटर का हिस्सा है), तो मैं 'ऑटो' का उपयोग करके किसी के साथ रह सकता हूं, लेकिन मैं इसके लिए डिफ़ॉल्ट नहीं होगा। –

8

मुझे लगता है कि आपको आवश्यक सभी भिन्नताओं को परिभाषित करने की आवश्यकता है।

अपने लोगों को बजेर्न स्टॉस्ट्रप से प्रस्तुति देखने के लिए प्राप्त करें और सी ++ 11 में कुछ ब्लॉग पढ़ें। चूंकि टेम्पलेट्स पुस्तक सूची में कुछ किताबें खरीदते हैं और "संयोग से" चर्चा शुरू करने के लिए उनमें से कुछ को अपने डेस्क पर छोड़ दें।

आप कुछ पावरपॉइंट प्रस्तुतियां भी लिख सकते हैं, और उन्हें अपने टीम के सदस्यों को पेश कर सकते हैं और अनुसंधान की संस्कृति का निर्माण कर सकते हैं।

Bjarne Stroustrup: C++11 Style

पुस्तक सूची: https://stackoverflow.com/tags/c%2b%2b/info

+1

सलाह के लिए धन्यवाद। संयोग से, मैं पहले से ही यह सब कर रहा हूँ। मैंने गोइंगनेटिव 2012 के साथ-साथ "सी ++ और परे" से सभी मुख्य नोट्स देखना समाप्त कर दिया, और कुछ अन्य जिन्हें मैं ऑनलाइन ढूंढ सकता था। मैंने हाल ही में "मॉडर्न सी ++ डिज़ाइन" खरीदा है, लेकिन वह टेम्पलेट कोड शायद मेरे सहकर्मियों को जीतने वाला नहीं है, कम से कम तब तक जब तक कि मैं कुछ खुद को लिखूं और मेरे सहकर्मी लचीलेपन पर न आएं। मैं भी अपनी खुद की प्रस्तुतियां कॉन्स-शुद्धता, स्वामित्व अर्थशास्त्र (और अर्थशास्त्र को स्थानांतरित करने), लैम्ब्डास, और फिर सी ++ 11 सुविधाओं की एक पोटपोरी प्रस्तुति पर भी प्रस्तुत कर रहा हूं। –

4

मैं प्रत्येक स्थिरांक और गैर स्थिरांक प्रकार

के लिए अतिरिक्त typedefs परिभाषित करने के लिए ... जो के रूप में एक मिश्रित विस्फोट का कारण होगा होगा उन स्थानों की संख्या जहां const प्रकार बढ़ने में फिट बैठता है। अपने सहयोगियों को समझाएं कि आप जो काम कर रहे हैं वह तेजी से बढ़ता है क्योंकि वे इसका उपयोग करने के बजाय भाषा से लड़ रहे हैं। और हां, उपयुक्त होने पर auto का उपयोग करें।

1

जब मैं एक नया वर्ग बनाने के पहले काम मैं करता हूँ में से एक है:

class MyClass 
{ 
public: // Typedefs 
    typedef std::shared_ptr<MyClass> Ptr; 
    typedef std::shared_ptr<const MyClass> ConstPtr; 
}; 

तो मेरी कक्षा का उपयोगकर्ता के लिए इसका इस्तेमाल कर सकते हैं:

MyClass::Ptr pMyClass = std::make_shared<MyClass>(); 

कारण मैं करने के लिए उन्हें जोड़ने सार्वजनिक टाइपपीफ के रूप में कक्षा मुझे वैश्विक नामस्थान को प्रदूषित करने से नफरत है।

+2

मैंने उस दृष्टिकोण को माना था।आपके 'MyClass :: ConstPtr' के साथ मेरा एकमात्र मुद्दा यह है कि मैं इसे पढ़ूंगा जैसे 'ptr'' const' था,' MyClass' ऑब्जेक्ट नहीं। मैं एक नामकरण सम्मेलन के साथ नहीं आ सकता हूं जो उचित रूप से बताता है कि भाषा आसानी से क्या प्रदान करती है, इसलिए मैं टाइपपीफ से बचने और बस भाषा का उपयोग करने की ओर झुका रहा हूं। –

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