std::get
के कई ओवरलोड हैं, इसके अलावा, प्रत्येक एक फ़ंक्शन टेम्पलेट स्वयं है, इसलिए संकलक यह नहीं बता सकता कि आप कॉल साइट पर कौन सा चाहते हैं, जहां आप उनमें से किसी के पते के लिए अनुरोध करते हैं। आप std::get
के प्रयोग पर जोर देते हैं, तो आप static_cast
उपयोग करने की आवश्यकता होगी:
transform(mss.begin(), mss.end(), back_inserter(vs),
static_cast<const map<string, string>::key_type&
(*)(map<string, string>::value_type&)>(std::get<0>)
);
कौन सा static_cast
में प्रकार के रूप में लंबे समय के रूप में काम करेगा या संभव समारोह टेम्पलेट की विशेषज्ञता तर्क के रूप में दिए गए की घोषणा से मेल खाता है। साथ ही, आप get<0, string, string>
इत्यादि जैसे फ़ंक्शन टेम्पलेट्स के टेम्पलेट तर्कों को स्पष्ट रूप से निर्दिष्ट करने का प्रयास नहीं करते हैं - यह टेम्पलेट तर्क कटौती तंत्र के लिए है। न केवल वाक्यविन्यास बदसूरत है, लेकिन भविष्य में आपके संकलन को तोड़ने वाले अन्य अधिभार भी जोड़े जा सकते हैं।
transform(mss.begin(), mss.end(), back_inserter(vs),
[](map<string, string>::value_type& p){ return p.first; });
या एक सामान्य लैम्ब्डा अभिव्यक्ति (सी ++ 14):
एक ज्यादा बेहतर विकल्प एक लैम्ब्डा अभिव्यक्ति उपयोग करने के लिए है
transform(mss.begin(), mss.end(), back_inserter(vs),
[](auto& p){ return p.first; }); // or `return std::get<0>(p);`
या std::mem_fn
जो बांधता है इसके किसी डेटा सदस्य या सदस्य फ़ंक्शन को किसी दिए गए पॉइंटर पर तर्क:
#include <functional>
transform(mss.begin(), mss.end(), back_inserter(vs),
mem_fn(&map<string, string>::value_type::first));
धन्यवाद। मैं सुपर-संक्षिप्त '<0>' प्राप्त करने में सक्षम होने की उम्मीद कर रहा था, लेकिन ... इसका मतलब नहीं था। ओह अच्छा। – screwnut