लेता है मैं एक इंटरफेस मॉडल जेनरेटर चाहता हूं जिसमें एक विधि उत्पन्न होती है() जो साक्ष्य की एक पुनरावृत्ति सूची लेती है और एक मॉडल बनाती है। एसटीएल छद्म बतख टाइपिंग इटरेटर मुहावरा का प्रयोग ...सी ++ वर्चुअल विधि जो एसटीएल-स्टाइल इटरेटर
template<class Model>
class ModelGenerator {
public:
template<class Iterator>
virtual bool generate(Iterator begin, Iterator end, Model& model) = 0;
};
लेकिन आभासी कार्यों टेम्प्लेट नहीं किया जा सकता। तो मैं पूरी कक्षा टेम्पलेट के लिए है:
template<class Model, class Iterator>
class ModelGenerator {
public:
virtual bool generate(Iterator begin, Iterator end, Model& model) = 0;
};
आदर्श रूप में मैं क्या करना चाहते हैं क्या कुछ इस तरह है ...
template<class Model, class Evidence>
class ModelGenerator {
public:
virtual bool generate(iterator<Evidence>& begin,
iterator<Evidence>& end,
Model& model) = 0;
};
लेकिन ऐसी कोई इंटरफ़ेस है कि iterators से विरासत है। (कक्षा std :: iterator में केवल typedefs का कोई गुच्छा नहीं है, कोई तरीका नहीं है।)
ऐसा करने का एकमात्र तरीका मैं मॉडल जेनरेटर को एक विधि addEvidence() देना चाहता हूं जो उत्पन्न करने से पहले उन्हें एक-एक करके जोड़ता है (), लेकिन फिर मुझे मॉडल जेनरेटर स्टेटस देना है जो दर्द का थोड़ा सा है।
मैं एक वर्चुअल विधि कैसे लिख सकता हूं जो कोई एसटीएल कंटेनर लेता है?
CRTP यहाँ उपयोगी हो सकता है। – Mehrdad
आपको वर्चुअल फ़ंक्शन से सभी इटरेटर ऑपरेशंस को फैक्टरिंग के बारे में सोचना चाहिए। टेम्पलेटेड फ़ंक्शन एक 'std :: वेक्टर <साक्ष्य *>' उत्पन्न कर सकता है और उसे 'वर्चुअल' फ़ंक्शन पर भेज सकता है। उस प्रकार के रैपर की प्रदर्शन लागत और प्रोग्रामिंग प्रयास 'any_iterator' /' any_range' से कम होने की संभावना है। – Potatoswatter