दिलचस्प पोस्ट
jquery fancybox 2.0.3 – fancybox के बाहर क्लिक के नजदीक से रोकें sed खोज और स्ट्रिंग की जगह युक्त / JqGrid के रिक्त रिकॉर्ड्स विकल्प का उपयोग करना आईओएस छवि अभिविन्यास अजीब व्यवहार है पायथन में स्ट्रिंग संमिलन बनाम स्ट्रिंग प्रतिस्थापन एंड्रॉइड में हमेशा टॉप टॉपस्क्रीन ओवरले गतिविधि कैसे बनाएं कस्टम सूची दृश्य में स्क्रॉल पर चेक बॉक्स अनचेक हो जाता है CSS3 रूपांतरण: घुमाएगी; IE9 में ImageMagick: अधिकतम फ़ाइल-आकार के साथ जेपीईजी छवि पैमाने इनपुट फ़ील्ड में वर्णों की संख्या सीमित करें समय के साथ GameObject घुमाएँ IIS6 को जेएसओएन फाइलों (इंक पोस्ट, जीईटी) की सेवा प्रदान करें? स्पार्क जेडीबीसी चालक को खोजने में असमर्थ सी ++ अरिथेटिक संवर्धन हेडर का उपयोग क्या आईडीसीसी के कोई एलआरयू कार्यान्वयन है?

सी ++ टेम्प्लेट का इस्तेमाल करते हुए विज़िटर पैटर्न को लागू करना

मैं विज़िटर पैटर्न को लागू करने के लिए C ++ टेम्पलेट का उपयोग करके अपने कोड में बॉयलरप्लेट की मात्रा को कम करने का प्रयास कर रहा हूं। अभी तक मैं इस के साथ आया हूँ:

class BaseVisitor { public: virtual ~BaseVisitor() {} }; template<typename T> class Visitor : public BaseVisitor { public: virtual void visit(T& /* visitable */) = 0; }; template<typename Derived> class Visitable { public: void accept(Visitor<Derived>& visitor) { visitor.visit(static_cast<Derived&>(*this)); } }; 

और विजिट होने वाले प्रत्येक उपखंड इस तरह दिखता है:

 class Mesh : public Object, public Visitable<Mesh> {}; class Text : public Object, public Visitable<Text> {}; 

और अंत में आगंतुक इस तरह दिखता है:

 class Renderer : public Visitor<Mesh>, public Visitor<Text> {} 

अब तक इतनी अच्छी … अब ये समस्या है:

 for(Scene::iterator it = scene.begin(); it != scene.end(); ++it) { Object& object = static_cast<Object&>(*it); if(pre_visit(object)) { object.accept(this); ///Erm, what do I cast to?? post_visit(object); } } 

मुझे किसी तरह दिखने की ज़रूरत है ताकि मैं स्वीकार कर सकूं (), लेकिन जाहिर तौर पर मुझे नहीं पता कि टी क्या है वैकल्पिक रूप से मैं एक आभासी स्वीकार नहीं कर सकता () Visitable टेम्पलेट को स्वीकार करता है, क्योंकि मुझे नहीं पता कि यह किस तर्क को लेना चाहिए।

कोई भी सी ++ टेम्पलेटिंग गुरु वहाँ पता है कि यह काम कैसे करें?

Solutions Collecting From Web of "सी ++ टेम्प्लेट का इस्तेमाल करते हुए विज़िटर पैटर्न को लागू करना"

यह variadic टेम्पलेट्स का उपयोग करके सी ++ 11 में किया जा सकता है। पीट के उत्तर से जारी रहना:

 // Visitor template declaration template<typename... Types> class Visitor; // specialization for single type template<typename T> class Visitor<T> { public: virtual void visit(T & visitable) = 0; }; // specialization for multiple types template<typename T, typename... Types> class Visitor<T, Types...> : public Visitor<Types...> { public: // promote the function(s) from the base class using Visitor<Types...>::visit; virtual void visit(T & visitable) = 0; }; template<typename... Types> class Visitable { public: virtual void accept(Visitor<Types...>& visitor) = 0; }; template<typename Derived, typename... Types> class VisitableImpl : public Visitable<Types...> { public: virtual void accept(Visitor<Types...>& visitor) { visitor.visit(static_cast<Derived&>(*this)); } }; 

Visitable उपवर्ग:

 class Mesh : public Object, public VisitableImpl<Mesh, Mesh, Text> {}; class Text : public Object, public VisitableImpl<Text, Mesh, Text> {}; 

एक Visitor उप-वर्ग:

 class Renderer : public Visitor<Mesh, Text> {}; 

यह स्पष्ट नहीं है कि आपके Scene कंटेनर का value_type क्या है, लेकिन आपको संदर्भित करने के लिए एक संदर्भ या सूचक प्राप्त करने की Visitable<Mesh, Text> जिस पर कॉल को accept :

 for(Scene::iterator it = scene.begin(); it != scene.end(); ++it) { Visitable<Mesh, Text>& object = static_cast<Visitable<Mesh, Text>&>(*it); if(pre_visit(object)) { object.accept(*this); post_visit(object); } } 

आपके बेस विज़िटर ने आपके लिए कुछ भी नहीं किया है, आगंतुकों को हटाने के लिए मनमानी विज़िट की अनुमति देने के अलावा इसके बजाय, आप आगंतुक के लिए एक बेस क्लास चाहते हैं जो उस पर विभिन्न Visitable को स्वीकार करने वाले सभी accept कार्य प्रदान करता है, और इस आगंतुक को स्वीकार करने के लिए Visitable लिए।

ऐसा करने के लिए, आप उन प्रकारों को परिभाषित करने के लिए एक प्रकार की सूची का उपयोग कर सकते हैं जो विज़िटर स्वीकार कर सकते हैं, आधार विज़िटे क्लास कर सकते हैं, जो कि प्रकार सूची लेता है, और अपनी विज़िट कार्यान्वयन के लिए पैरामीटर के रूप में प्रकार सूची को जोड़ते हैं

उदाहरण के स्केच:

 // assuming a typelist has typedefs first and second and a // type 'empty' representing end of type list template<typename Types> class Visitor : public Visitor<Types::second> { public: // visitor has a visit function for each type in Types virtual void visit(typename Types::first& visitable) = 0; }; template<> class Visitor<empty> { }; template<typename Types> class Visitable{ public: // base accepts a visitor which can visit any type in Types virtual void accept(Visitor<Types>& visitor) = 0; }; template<typename Derived, typename Types> class VisitableImpl : public Visitable<Types> { public: // impl calls specific visit function virtual void accept(Visitor<Types>& visitor) override { visitor.visit(static_cast<Derived&>(*this)); } };