मैं वास्तव में, आप std::get
functor के रूप में उपयोग करना चाहते हैं, क्योंकि यह पहले से ही एक पुस्तकालय समारोह के रूप में प्रदान की जाती है !!
अगर हम इस लाइन को लिख सकते हैं तो यह अच्छा नहीं होगा !?
std::transform(pairs.begin(), pairs.end(), std::back_inserter(items), std::get<0>);
... लेकिन यह उससे थोड़ा अधिक भयानक है। std::get
is overloaded 1. pair&
लेने के लिए, 2. पैरामीटर के रूप में const pair&
, और 3. pair&&
, इतना है कि यह जोड़ी किसी भी प्रकार के लिए काम करेंगे
int main() {
std::vector<int> items;
std::vector<std::pair<int, int>> pairs;
pairs.push_back(std::make_pair(1, 3));
pairs.push_back(std::make_pair(5, 7));
std::transform(pairs.begin(), pairs.end(), std::back_inserter(items),
(const int& (*)(const std::pair<int, int>&))std::get<0>);
return 0;
}
समस्या है,: आप का उपयोग करने के स्पष्ट करने के लिए जो get
की जरूरत इनपुट के रूप में।दुर्भाग्य से, भार के std::transform
के लिए टेम्पलेट प्रकार कटौती के रास्ते में है, इसलिए हमारे मूल लाइन
std::transform(pairs.begin(), pairs.end(), std::back_inserter(items), std::get<0>);
पैदावार
error: no matching function for call to ‘transform(std::vector<std::pair<int, int> >::iterator, std::vector<std::pair<int, int> >::iterator, std::back_insert_iterator<std::vector<int> >, <unresolved overloaded function type>)’
std::transform(pairs.begin(), pairs.end(), std::back_inserter(items), std::get<0>);
^
...
/usr/include/c++/4.8/bits/stl_algo.h:4915:5: note: template argument deduction/substitution failed:
note: couldn't deduce template parameter ‘_UnaryOperation’
std::transform(pairs.begin(), pairs.end(), std::back_inserter(items), std::get<0>);
यह पता नहीं है std::get
की जो अधिभार आप जब बात का अनुमान लगाना के लिए पूछ रहे हैं std::transform
के लिए टेम्पलेट, इसलिए आपको इसे मैन्युअल रूप से निर्दिष्ट करना होगा। फ़ंक्शन पॉइंटर को सही प्रकार पर कास्ट करना कंपाइलर को बताता है, "अरे, कृपया अधिभार का उपयोग करें जहां get
const&
लेता है और const&
देता है!"
लेकिन कम से कम हम मानक पुस्तकालय घटक (yay) का उपयोग कर रहे हैं?
और लाइनों की संख्या के मामले में, यह कोई अन्य विकल्प से भी बदतर है: http://ideone.com/6dfzxz
क्या कोई भी किसी भी सुधार के बारे में सोच सकता है? इस तरह 'std :: get' का उपयोग करने में सक्षम होना बहुत अच्छा होगा। ... वास्तव में मुझे शायद 'reinterperet_cast &)> (std :: <0> प्राप्त करें)' का उपयोग करना चाहिए, लेकिन यह और भी बदतर लगता है ... –
NHDaly
मुझे लगता है कि यह एक "लैम्ब्डा" के अंदर लिपटे फ़ंक्शन के साथ "हार्ड" कास्ट को प्रतिस्थापित करना संभव है जिसके लिए कोई तर्क निर्दिष्ट कर सकता है –