मेरे पास लंबे टेम्पलेट्स के लिए टाइपपीफ के उपयोग के संबंध में एक त्वरित प्रश्न है। क्रूक्स: मैंने खुद को एक अचार में पाया है-क्लाइंट फ़ंक्शंस को स्थानीय को छोड़कर टाइपपीफ रखने के लिए एक अच्छी जगह नहीं लगती है। जबकि SO प्रश्न हैं (उदाहरण के लिए here देखें), कोई भी इसे ठीक से संबोधित नहीं करता है। कृपया ध्यान दें कि यह प्रश्न इस बात का समाधान नहीं करता है कि क्या टाइपिफ्स वांछित हैं, इस प्रकार मैंने वांछित उद्देश्यों के लिए चीजों को सरल बनाने की कोशिश की है।साझा पॉइंटर्स टाइप करने के लिए सबसे अच्छी रणनीति क्या है?
boost::shared_ptr<T>
के साथ काम करते समय मेरी समस्या उत्पन्न हुई है। असल में, मैं निम्नलिखित करना चाहते हैं:
#include <boost/shared_ptr.hpp>
typedef boost::shared_ptr<Widget> WidgetPtr;
Widget
घोषणा शीर्षक में इस typedef रखने बदसूरत लगता है। यहां दो विचारधाराएं प्रतीत होती हैं: (i) यदि Widget
स्वयं अपने सदस्यों में साझा पॉइंटर्स का उपयोग नहीं करता है, तो हमने एक अतिरिक्त शामिल किया है (क्योंकि हम boost::shared_ptr
टेम्पलेट क्लास घोषित करने के लिए आगे नहीं बढ़ सकते हैं-अगर मैं गलत है?) (ii) अगर हम किसी अन्य वर्ग की घोषणा के दौरान इस टाइपिफ़ का उपयोग करना चाहते हैं (उस वर्ग को कॉल करें Foo
) हम Widget.h
सहित Widget
या WidgetFwd.h
सहित घोषित करने के बजाय सर्वोत्तम प्रथाओं का उल्लंघन करते हैं ... जब तक कि यह टाइपिफ़ को बाद में डुप्लिकेट किया गया है। इसके अलावा, Widget
की घोषणा के दौरान टाइपिफ़ boost::shared_ptr<Widget>
को यह समझ में नहीं आता है- हम Widget
की घोषणा को Widget
इंटरफ़ेस का उपयोग करने के तरीके की प्रत्याशा के साथ Widget
की घोषणा को मिश्रित कर रहे हैं।
ठीक है, तो यह बुरा है, लेकिन यह बदतर है, लेकिन यह बदतर है: अगर मैं ऊपर के कुछ संयोजन का प्रयास नहीं करता हूं तो मैं क्लाइंट कोड में डुप्लिकेट टाइपपीफ के साथ समाप्त होता हूं, जो असंगतता (और इसलिए, संभावित, त्रुटि) उत्पन्न करता है - पूरे बिंदु यह है कि Widget
दिए गए, WidgetPtr
टाइपपीफ को अपने आप में एक प्रकार के रूप में कार्य करना चाहिए। उदाहरण: हम Foo
को WidgetPtr
का उपयोग करने के लिए नहीं चाहते हैं, boost::shared_ptr
का टाइपपीफ, जबकि Bar
std::auto_ptr
के लिए टाइपपीट के रूप में विजेटपीआरटी का उपयोग कर रहा है।
एक अन्य विधि (और कुछ है कि मैंने देखा है ऑनलाइन चर्चा में उल्लेख किया है में से एक) typedef Widget
की एक सार्वजनिक सदस्य बनाने के लिए किया जाएगा और उसके बाद Widget::Ptr
का उपयोग करें:
class Widget {
// ...
public:
typedef boost::shared_ptr<Widget> Ptr;
};
फिर से, मैं डॉन ' इस तरह से (i) यह सुझाव देता है कि सूचक प्रकार किसी भी तरह वर्ग का सदस्य है और (ii) यह एक भद्दा इंटरफ़ेस की ओर जाता है। इससे भी बदतर: चूंकि मैं लिखने वाली हर कक्षा को स्मार्ट पॉइंटर्स का उपयोग करने की ओर इशारा किया जा सकता है, इसलिए मैं काल्पनिक ग्राहक की पूंछ का पीछा करता हूं। बदसूरत, बदसूरत, बदसूरत।
जैसा कि यह खड़ा है, मैंने इस कोडबेस से टाइपपीफ को हटा दिया है (क्योंकि उन्होंने गंभीर भ्रम, डुप्लिकेशन) का नेतृत्व किया है और उन्हें चयनित कार्यों में स्थानीय रूप से फिर से पेश किया है। यहां फिर से असंगत उपयोग के साथ एक समस्या है लेकिन यह काफी गंभीर नहीं है।
एकमात्र अन्य समाधान जिसे मैं सोच सकता हूं-और फिर मुझे यकीन नहीं है कि यह अच्छा अभ्यास माना जाता है-क्या एक यूटिलिटी हेडर होना चाहिए जिसमें टाइपिफ्स रखा गया हो, संभावित रूप से अपने नामस्थान में। इस शीर्षलेख में हम इसमें शामिल होंगे और इसके साथ किया जाएगा।
क्या मुझे कुछ स्पष्ट याद आ रही है या क्या यह सिर्फ सादा मुश्किल है?
उपरोक्त की लंबाई के लिए पीएस-माफी; मुझे समस्या को पूरी तरह से व्यक्त करने का एक आसान तरीका नहीं मिला।
बीटीडब्लू- पहली जगह में टाइपिंगफिंग करने का तर्क क्या तर्क है? नाम 'shared_ptr' नाम बहुत सरल है - एक विजेट के लिए एक साझा सूचक। यहां कोई स्पष्ट कोड ब्लोट नहीं है ('बूस्ट ::' भाग को छोड़कर) imho ... –
Kos
@ कोस: मुझे लगता है कि समस्या तब उत्पन्न होती है जब आपके पास विजेट की बजाय विजेट जैसी कुछ है। जैसे ही स्क्रीन स्क्रीन पर फिट नहीं होता है, आप typedef'ing के बारे में शुरू करते हैं :-) –
Philipp
यदि आप भविष्य में साझा पॉइंटर्स को बदलना नहीं चाहते हैं, तो टाइपइपिफ़िंग काफी आसान है। –