एसटीएल आमतौर पर परिभाषित करता है तो जैसे एक निर्गम इटरेटर:आउटपुट इटरेटर के VALUE_TYPE
template<class Cont>
class insert_iterator
: public iterator<output_iterator_tag,void,void,void,void> {
// ...
क्यों उत्पादन iterators value_type
void
के रूप में परिभाषित करते हैं? यह एल्गोरिदम के लिए उपयोगी होगा कि यह जानने के लिए कि किस प्रकार का मूल्य आउटपुट होना चाहिए।
उदाहरण के लिए, एक फ़ंक्शन जो यूआरएल क्वेरी "key1=value1&key2=value2&key3=value3"
का अनुवाद किसी भी कंटेनर में करता है जिसमें कुंजी-मूल्य स्ट्रिंग तत्व होते हैं।
template<typename Ch,typename Tr,typename Out>
void parse(const std::basic_string<Ch,Tr>& str, Out result)
{
std::basic_string<Ch,Tr> key, value;
// loop over str, parse into p ...
*result = typename iterator_traits<Out>::value_type(key, value);
}
SGI reference page of value_type
संकेत यह है, क्योंकि यह एक आउटपुट इटरेटर भिन्नता के लिए संभव नहीं है। लेकिन उस value_type
का ही उपयोग नहीं है: मैं आदेश इटरेटर निर्दिष्ट करने के लिए में एक दृष्टांत कर सकते हैं।
आउटपुट इटरेटर के साथ आउटपुट के लिए मूल्य बनाने के लिए क्या वैकल्पिक दृष्टिकोण है? दो दृष्टिकोण मैं माना:
- एक functor पैरामीटर है कि सही प्रकार का ऑब्जेक्ट वापसी होगी स्वीकार करें। मैं अभी भी एल्गोरिदम का एक संस्करण चाहता हूं जो उस फ़ंक्शन ऑब्जेक्ट पैरामीटर को नहीं लेता है।
- आवश्यकता होती है कि उत्पादन कंटेनर और कुछ एक प्रकार है कि से परिवर्तनीय
pair<string,string>
रखती है, या। मुझे आश्चर्य है कि मैं इस आवश्यकता के बिना कर सकता हूं, शायद किसी भी तत्व को दोstd::string
एस से बना सकता है।
मुझे क्या करना कोशिश कर रहा हूँ एल्गोरिथ्म ऐसी है कि वह किसी भी प्रकार के कंटेनर है कि दो 'स्ट्रिंग' रों से निर्माण कर सकते हैं, न सिर्फ' नक्शा <स्ट्रिंग, स्ट्रिंग> 'साथ काम करता है सामान्य है। फिर, टेम्पलेट '* result = pair (key, value) 'के साथ-साथ' * result = unicorn_pony (key, value)' में तत्काल हो सकता है। –
wilhelmtell
यदि मैं एक संदर्भ जोड़ सकता हूं: आउटपुट इटरेटर के बारे में एक पेपर [पीडीएफ], इस मुद्दे के बारे में भी शिकायत करता है। http://semantics.org/publications/02_02_multiout.pdf – wilhelmtell
उस पेपर में दिया गया उदाहरण बिल्कुल क्यों है कि आउटपुट इटरेटर्स को मूल्य प्रकार को परिभाषित करने की आवश्यकता नहीं है। उन्होंने मनमाने ढंग से निर्णय लिया कि 'मल्टीऑट :: value_type' 'डबल' होना चाहिए, लेकिन हकीकत में * किसी * प्रकार को जिसे' डबल 'और' int 'दोनों में रूपांतरित किया जा सकता है, असाइनमेंट ऑपरेटर के लिए उपयोग करने के लिए उचित मान हैं। –