2012-04-28 22 views
5

चलें कहते हैं कि मैं एक सदस्य चर के साथ एक वर्ग है:इस अभिव्यक्ति को सरल बनाना संभव है?

std::unordered_map<KeyType, std::shared_ptr<ValueType>> myMap 

और एक सदस्य समारोह मैं निम्नलिखित करना चाहते हैं में:

std::for_each(myMap.begin(), myMap.end(), [](std::pair<const KeyType, std::shared_ptr<ValueType>>& pair){pair.second->someMethod(); }); 

वहाँ वैसे भी लैम्ब्डा अभिव्यक्ति छोटा करने के लिए है? मैंने सोचा कि मैं ऐसा कर सकता है, लेकिन यह मान्य सिंटैक्स नहीं था:

std::for_each(myMap.begin(), myMap.end(), [](decltype(myMap::valueType)& pair){pair.second->someMethod(); }); 
+0

'नेमस्पेस std का उपयोग करके;' इसे थोड़ा छोटा कर देगा। –

+3

@ सोहोजुन अच्छा भगवान, ऐसा न करें :( – 111111

+1

@ 111111: यह परिभाषा में एक छोटे से स्थानीय क्षेत्र में ठीक है, न कि वैश्विक स्तर पर या शीर्षलेख में। –

उत्तर

5

मैं typedef ing Assoc कंटेनर की तरह जटिल टेम्पलेट्स, इस कारण के लिए, ताकि आप की तरह कुछ कर सकता है की सिफारिश:

typedef std::unordered_map<KeyType, std::shared_ptr<ValueType>> map_type; 

map_type myMap; 

//do with map 

std::for_each(myMap.begin(), myMap.end(), 
    [](typename map_type::value_type& pair){ 
     pair.second->someMethod(); 
}); 

या बिना typedef

std::for_each(myMap.begin(), myMap.end(), 
    [](typename decltype(myMap)::value_type& pair){ 
     pair.second->someMethod(); 
}); 

decltype एक वस्तु के प्रकार के हो जाता है, तो आप typename एक टेम्प्लेटेड वर्ग में परिभाषित उपयोग करने के लिए, यह करने के लिए आप typename का उपयोग की जरूरत है कीवर्ड। यह आवश्यक है कि एक टेम्पलेट विशेषज्ञता में टाइपिफ़ नहीं है।

9

मैं लैम्ब्डा से बिल्कुल परेशान नहीं होगा। अन्य मानक एल्गोरिदम के विपरीत, for_each() बराबर for की तुलना में अधिक अभिव्यक्तिपूर्ण या पठनीय नहीं है।

for (auto& p : myMap) 
    p.second->someMethod(); 

for (auto p = myMap.begin(); p != myMap.end(); ++p) 
    p->second->someMethod(); 
+1

दरअसल, मैं यह भी कहूंगा कि 'for_each' को सिंटैक्स के लिए नई सीमा के साथ-साथ बहिष्कृत किया गया है। इससे पहले कुछ फायदे थे (एक भविष्यवाणी लिखने की लागत पर), लेकिन अब?यह भी इसके लायक नहीं है। –

+0

आप सिंटैक्स के लिए श्रेणी के साथ एक कंटेनर में विशिष्ट श्रेणी का उपयोग नहीं कर सकते हैं ... – Klaim

+0

@Klaim: अच्छा बिंदु। फिर फिर, हमेशा के लिए एक सामान्य 'हमेशा' है। यदि यह टाइपिंग समस्याओं के लिए नहीं था, तो 'for_each() 'कुछ कीस्ट्रोक सहेज सकता है, लेकिन जैसा कि है,' अभी भी 'कई मामलों में शीर्ष पर आता है। –

0

मैं एक मैक्रो जो इस रूप में चला जाता है कर दिया है: // बेनामी लैम्ब्डा प्रकार कंटेनर नाम

#define _A(container)\ 
    std::remove_reference<decltype(*std::begin(container))>::type 

से कटौती के रूप में अपने मामले उपयोग में:

std::for_each(myMap.begin(), myMap.end(), [](_A(myMap)& pair) { 
    pair.second->someMethod(); 
}); 

नोट : remove_referenceटाइप करते समय स्थिरता को संरक्षित करने के लिए आवश्यक है 10, अन्यथा &const घोषणा को हटा देता है।

+0

यह एक अधिक वर्बोज़ रेंज के लिए बहुत काम है-के लिए। –

+0

नहीं, यह नहीं है, और आप इसे प्रत्येक एल्गोरिदम के लिए उपयोग कर सकते हैं, केवल for_each के लिए नहीं। –

+0

मेरा मतलब मैक्रो स्वयं नहीं है (हालांकि, ठीक है, मैं आमतौर पर 'टाइपपीफ' का उपयोग करता हूं, इसलिए यह मेरी कोडिंग शैली के साथ उतना उपयोगी नहीं होगा), मेरा मतलब है कि आपने लिखा 'for_each' है। 'के लिए (ऑटो और पी: myMap) {p.second-> कुछ विधि(); } '** ** बहुत कम है। –

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