2013-08-09 13 views
6

इस तरह की उपयोगिता मैन्युअल रूप से लिखने से बेहतर समाधान?std :: tuple के माध्यम से फिर से कैसे करें?

template <size_t> struct SizeT { }; 

template < typename TupleType, typename ActionType > 
inline void TupleForEach(TupleType& tuple, ActionType action) 
{ 
    TupleForEach(tuple, action, SizeT<std::tuple_size<TupleType>::value>()); 
} 

template < typename TupleType, typename ActionType > 
inline void TupleForEach(TupleType& tuple, ActionType action, SizeT<0>) { } 

template < typename TupleType, typename ActionType, size_t N > 
inline void TupleForEach(TupleType& tuple, ActionType action, SizeT<N>) 
{ 
    TupleForEach(tuple, action, SizeT<N-1>()); 
    action(std::get<N-1>(tuple)); 
} 

इस तरह इस्तेमाल किया जा करने के लिए:

उस पर पुनरावृति करने की आवश्यकता
std::tuple<char, int, double> tt; 
TupleForEach(tt, (boost::lambda::_1 = 5)); 
+1

"बेहतर" के लिए आपके मानदंड क्या हैं? – Casey

+0

@ कैसी - 'std' या' boost' में लाइब्रेरी कार्यान्वयन; यदि नहीं, तो कम कोड के साथ एक कार्यान्वयन तो यह; या शायद इस कार्यान्वयन में एक मुद्दा है। – Vahagn

उत्तर

1

हालांकि कई एक previous, related question (और एक तुम अपने आप को प्रदान करते हैं) में प्रदान की जाती जवाब देखते हैं, मेरे प्रारंभिक धारणा है ट्यूपल एक खराब डिजाइन का प्रतिबिंब हो सकता है।

जैसा कि आप जानते हैं, हम मानक सी ++ एल्गोरिदम का उपयोग कर std::tuple पर पुन: प्रयास नहीं कर सकते हैं क्योंकि std::tupleContainer concept को पूरा नहीं करता है। और, ठीक है, यह ऐसी अवधारणा को पूरा नहीं करता है क्योंकि std::tuple के पास value_type नहीं है (वे विषम हैं)। मुझे पता है कि आपने एक ट्यूपल का उपयोग किया क्योंकि आप अपना खुद का पॉलिमॉर्फिक प्रकार नहीं बनाना चाहते थे और इसे मानक कंटेनर में स्टोर करना चाहते थे (उदाहरण के लिए, std::vector<std::shared_ptr<BaseClass>>)। इससे आपको त्वरित लाभ मिला। लेकिन इसका यह भी अर्थ है कि आपने स्वेच्छा से Container एस के फायदे छोड़ दिए हैं।

यह काम कर सकता है, लेकिन यह किसी भी तरह से मजबूर और अप्राकृतिक महसूस करता है: यदि आपको कंटेनर अर्थशास्त्र की आवश्यकता है, तो कंटेनर का उपयोग क्यों न करें? यदि आपको पॉलिमॉर्फिक अर्थशास्त्र की आवश्यकता है, तो पॉलिमॉर्फिक प्रकार का उपयोग क्यों न करें?

शायद मैं अतिरंजित हूं, लेकिन यह मेरी प्रारंभिक छाप है।

+0

कारण मैंने ट्यूपल में प्रकारों के लिए एक पॉलिमॉर्फिक बेस क्लास नहीं बनाया है, यह एक सनकी नहीं है :) ये प्रकार तीसरे पक्ष की तरह हैं, इसलिए जो उनका उपयोग करता है, निश्चित रूप से, जरूरी नहीं है जो रखता है उन्हें। हालांकि, इन प्रकारों में एक आम अवधारणा साझा की जाती है, इस प्रकार कुछ ऑपरेशन उनमें से प्रत्येक के लिए मान्य होते हैं, इसलिए जो इस प्रकार की वस्तुओं का एक गुच्छा स्टोर करता है, वह उन वस्तुओं पर ऐसे संचालन करना चाहता है। – Vahagn

+4

इसके अलावा, 'char',' int' और 'double' के tuple पर विचार करें। या कुछ पॉइंटर्स का एक झुकाव। पहले मामले में उदाहरण है टुपल सदस्यों को शून्य पर सेट करने का एक वैध संचालन, और दूसरे मामले में उदा। टुपल सदस्यों को 'nullptr' पर सेट करने का एक वैध संचालन, लेकिन निश्चित रूप से सी ++ में यह सभी अंकगणितीय प्रकारों के लिए बेस क्लास या सभी पॉइंटर प्रकारों के लिए बेस क्लास पर विचार करने के लिए बकवास है। – Vahagn

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