मैंने वास्तव में एक छोटी उपयोगिता लिख दी जो देरी से इनवोकेशन फ़ैक्टर (कुछ हद तक std::bind
-जैसा बनाता है, लेकिन नेस्टेड बाइंड एक्सप्रेशन/प्लेसहोल्डर्स फीचर्स के बिना)।मेरा मुख्य प्रेरणा इस मामले कि मैंने पाया था जवाबी सहज ज्ञान युक्त:
using pointer_type = std::unique_ptr<int>;
pointer_type source();
void sink(pointer_type p);
pointer_type p = source();
// Either not valid now or later when calling bound()
// auto bound = std::bind(sink, std::move(p));
auto bound = std::bind(
[](pointer_type& p) { sink(std::move(p)); }
, std::move(p));
bound();
कि एडाप्टर के लिए कारण (जो sink
करने के लिए अपने lvalue रेफरी तर्क चलता है) कि std::bind
द्वारा कॉल आवरण वापसी हमेशा lvalues के रूप में बाध्य तर्क अग्रेषित करता है । यह समस्या के साथ कोई समस्या नहीं थी C12+ 03 में boost::bind
क्योंकि उस लवली या तो अंतर्निहित कॉल करने योग्य ऑब्जेक्ट के संदर्भ तर्क या प्रतिलिपि के माध्यम से मान तर्क के साथ बाध्य होगा। pointer_type
के बाद से यहां काम नहीं करता है केवल स्थानांतरित है। कैसे बाध्य तर्क संग्रहीत होना चाहिए, और वे कैसे बहाल होना चाहिए (अर्थात प्रतिदेय वस्तु को पारित कर दिया):
अंतर्दृष्टि है कि मुझे मिल गया वास्तव में दो बातों पर विचार करने के लिए देखते हैं कि है। नियंत्रण जो std::bind
अनुदान देता है, आप निम्नानुसार हैं: तर्क या तो उथले (std::ref
के उपयोग के माध्यम से) या नियमित तरीके से (std::decay
का उपयोग करके आगे बढ़ते हैं); वे हमेशा लालच के रूप में बहाल होते हैं (सीवी-क्वालीफायर के साथ स्वयं कॉल कॉलर से विरासत में मिला)। सिवाय इसके कि आप बाद वाले को एक छोटे से साइट एडाप्टर लैम्ब्डा अभिव्यक्ति के साथ बाईपास कर सकते हैं जैसा मैंने अभी किया था।
यह तर्कसंगत रूप से बहुत कम नियंत्रण और सीखने के लिए अपेक्षाकृत बहुत अभिव्यक्ति है। तुलनात्मक रूप से मेरी उपयोगिता में bind(f, p)
(क्षय और स्टोर प्रति, lvalue के रूप में बहाल), bind(f, ref(p))
(उथले रूप से स्टोर, lvalue के रूप में बहाल), bind(f, std::move(p))
(चाल से क्षय और स्टोर, रैवल्यू के रूप में बहाल), bind(f, emplace(p))
(चाल से क्षय और स्टोर, lvalue के रूप में बहाल)। यह एक ईडीएसएल सीखने की तरह लगता है।
स्रोत
2012-05-10 01:17:53
यदि आप किसी स्थानीय के संदर्भ को बाध्य करते हैं, तो आप परेशानी में होंगे। – mfontanini
मैं नहीं होगा अगर बुलाया गया कार्य स्थानीय के दायरे से बाहर नहीं है। सी ++ में बहुत सी चीजें हैं जो आपको अपना पैर उड़ाने देती हैं। मेरा सवाल इस बिंदु पर अधिक है कि यह व्यवहार कम अंतर्ज्ञानी प्रतीत होता है। – ryaner
किसी बिंदु पर मेरे उत्तर में "और वह स्थानीय दायरे से बाहर चला गया" है, लेकिन स्पष्ट रूप से यह संपादन के बाद मिटा दिया गया है: एस – mfontanini