1। क्या x(123)
वास्तव में operator()
को मज़दूर के operator()
पर कॉल करता है जो std::function
उत्पन्न करता है जो बदले में operator()
फ़ंक्शन के operator()
को कॉल करता है जो अंततः func
पर कॉल करता है? क्या यह func(123)
पर कॉल करने के रूप में इष्टतम के रूप में कुछ अनुकूलित किया गया है?
आप अनुकूलन सक्षम हैं, 'सामान' inlined हो जाता है और आप इस func(123)
बुला के रूप में के रूप में किया जा रहा है इष्टतम पर भरोसा कर सकते हैं।
2। मज़ेदार कहां रहता है std::bind
उत्पन्न करता है? किस दायरे में? और std::bind
नाम कैसे है? (वहाँ नाम टकराव हो सकता है)
Precising: bind
एक 'क्षणभंगुर', कार्यान्वयन परिभाषित उत्पन्न करता है, अभिव्यक्ति के लिए बाध्य, कि function<>
को आबंटित है। समारोह सिर्फ एक वर्ग टेम्पलेट है (धन्यवाद, ल्यूक टी।)। और यह मानक पुस्तकालय में रहता है। हालांकि, बाध्य अभिव्यक्ति कार्यान्वयन परिभाषित हैं।
मानक लाइब्रेरी ऐसे अभिव्यक्तियों के एमपीएल पहचान को अनुमति देने के लिए लक्षणों (std::is_bind_expression<>
) के साथ आते हैं। Std :: function पर बाइंड एक्सप्रेशन की एक निर्णायक विशेषता यह है कि वे हैं (मैं क्या कहूंगा) स्थगित कॉल करने योग्य ऑब्जेक्ट्स (यानी वे वास्तविक कॉल साइट पर अधिभार चुनने की क्षमता सहित पूर्ण कॉल साइट अर्थशास्त्र बनाए रखते हैं)। std::function<>
, दूसरी तरफ, एक प्रोटोटाइप में आता है और आंतरिक रूप से callable object को टाइप एरर (सोच variant
या any
) द्वारा आंतरिक रूप से स्टोर करता है।
3। क्या lambdas std :: bind के सभी उपयोगों को प्रतिस्थापित कर सकता है?
4। क्या std :: इसके बजाय लैम्ब्डा के रूप में इसे लागू करने के रूप में इष्टतम के रूप में बांधता है?
AFAICT lambdas को बाइंड अभिव्यक्तियों के समान ही संकलित करना चाहिए। एक बात है कि मुझे लगता है कि lambdas कि बाँध भाव नहीं कर सकते कर सकते हैंnested bind expressions
है संपादित नेस्टेड बाँध भाव के विशिष्ट मुहावरा lambdas का उपयोग कर replicatable नहीं है, lambdas के पाठ्यक्रम को व्यक्त करने में सक्षम हैं (लगभग) एक ही और अधिक स्वाभाविक रूप से:
bind(f, bind(g, _1))(x);
// vs.
[](int x) { f(g(x)); };
5।std::function
के टेम्पलेट तर्क के सिंटैक्स के साथ क्या हो रहा है? यह पार्स कैसे प्राप्त करता है और मैं उस टेम्पलेट तर्क वाक्यविन्यास को कहीं और कैसे उपयोग कर सकता हूं?
यह सिर्फ एक समारोह हस्ताक्षर (एक समारोह के प्रकार), टेम्पलेट पैरामीटर के रूप में पारित किया जा रहा है।
आप इसे फ़ंक्शन पैरामीटर प्रकार के रूप में भी उपयोग कर सकते हैं, जो फ़ंक्शन पॉइंटर में घटता है (जैसा कि सरणी द्वारा-मूल्य पैरामीटर पॉइंटर्स को डाउनग्रेड करते हैं, धन्यवाद डेविड!)। अभ्यास में, सबसे कहीं भी, जब तक कि आप नाम एक चर/प्रकार की जरूरत नहीं है:
void receiveFunction(void(int, double)); // spunky 'function<>'-style syntax
void sample(int, double) { }
int main()
{
receiveFunction(sample);
}
void receiveFunction(void (*f)(int, double)) // boring 'old' style syntax
// void (f)(int, double) // ... also ok
{
// ..
}
2. आप में रुचि हो सकती है http://www.artima.com/cppsource/type_erasure.html – Flexo
एक समय में एक प्रश्न, कृपया। प्रत्येक एसओ पोस्ट एक सवाल है। –
यह एक ठोस प्रश्न की तुलना में प्रश्नों का एक सेट है, और वे वाक्यविन्यास ('फ़ंक्शन <> 'के तर्क के लिए) के व्यवहार से हैं (बाध्य रहते हैं? क्या लैम्ब्डा उन्हें प्रतिस्थापित कर सकता है?) प्रदर्शन (इच्छा इसे अनुकूलित किया जा सकता है?) –