मैं वर्तमान में टेम्पलेट किए गए कार्यों के साथ कुछ अभ्यास कर रहा हूं। मेरे पास ट्रांसफॉर्म एल्गोरिदम के कार्यान्वयन को लिखने का कार्य था। मैं तो वह ऐसा किया था और यह काम करता है:लैम्ब्डा
template <class in, class out, class T>
out stransform(in b, in e, out d, T p(const T&)) {
while (b != e)
*d++ = p(*b++);
return d;
}
सामान्य की तरह ही बदलना मैं अब
stransform(begin(vec1), end(vec1), back_inserter(vec2), predi<double>);
की तरह एक स्पष्ट प्रकार के साथ विधेय कॉल करने के लिए है, मैं सी पर ठोकर खाई ++ 11 lambdas और इस तरह मेरी समारोह कॉल करने के लिए चाहता था:
stransform(begin(vec1), end(vec1), back_inserter(vec2), [] (double x) ->double {return x * 10;});
मैं एक संकलक त्रुटि है कि प्रकार निष्कर्ष निकाला नहीं जा सकता मिलता है कि के साथ
। यह वह चीज है जिसे मैं समझ नहीं पा रहा हूं क्योंकि मैं वास्तव में दो बार अपने लैम्ब्डा में टी प्रकार को परिभाषित कर रहा हूं।
मैंने मूल ट्रांसफॉर्म फ़ंक्शन को भी वापस देखा, जिसके साथ यह काम कर रहा है। इसके बाद मैंने उसमें से implementation की जांच की और यह पूरी तरह से पूरे फ़ंक्शन के लिए टेम्पलेट क्लास के साथ कार्यान्वित किया गया है। क्या कार्यान्वयन के लिए सही तरीका टेम्पलेट्स के साथ भविष्यवाणी करता है?
template <class in, class out, class UnaryPredicate>
out stransform(in b, in e, out d, UnaryPredicate p);
यह कार्य करने के लिए संकेत दिए गए, lambdas और समारोह वस्तुओं को स्वीकार करेंगे:
मैंने ट्रांसफॉर्म के कार्यान्वयन को पढ़ने के बाद ऐसा सोचा, जिससे यह बहुत आसान हो जाता है। मुझे अभी भी आश्चर्य है कि मैं दूसरे मामले में क्यों काम नहीं करता हूं। – inf
@ बांसबोन मुझे लगता है क्योंकि एक लैम्ब्डा कोई फ़ंक्शन नहीं है बल्कि एक फ़ंक्शन ऑब्जेक्ट है, क्योंकि यह राज्य भी पकड़ सकता है (यह एक बंद है और न केवल एक फ़ंक्शन है)। –
ध्यान दें कि एक लैम्ब्डा जो किसी भी कैप्चरिंग नहीं करता है वह सामान्य कार्य (सूचक) में परिवर्तनीय है। – spraff