2009-11-22 17 views
6

मैं boost :: asio उदाहरणों के माध्यम से जा रहा हूं। मैं Example 4बूस्ट :: asio async_wait हैंडलर हस्ताक्षर

क्या भ्रमित है कि, इस उदाहरण में WaitHandler हस्ताक्षर

शून्य प्रिंट (यह)

लेकिन async_wait कॉल हैंडलर जिसका

उम्मीद है से देख रहा हूँ

हैंडलर का फ़ंक्शन हस्ताक्षर होना चाहिए:

शून्य हैंडलर ( कॉन्स बूस्ट :: सिस्टम :: error_code & त्रुटि // ऑपरेशन का परिणाम। );

Source: Boost documentation

के बाद से पैरामीटर प्रकार एक समारोह के हस्ताक्षर का हिस्सा है, यही कारण है कि ऊपर के उदाहरण में, async_wait हैंडलर जिसका पैरामीटर प्रकार बढ़ावा की नहीं है :: प्रणाली :: error_code त्रुटि को स्वीकार करता है?

धन्यवाद।

उत्तर

11

जैसा कि आप सही ढंग से देखते हैं, async_wait विधि एक हैंडलर फ़ंक्शन स्वीकार करती है जो एक पैरामीटर लेती है (कॉन्स बूस्ट :: सिस्टम :: error_code &)। लेकिन Timer.4 उदाहरण में, async_wait करने के लिए कॉल बढ़ावा बाँध के माध्यम से पारित हो जाता है इस प्रकार है:

timer_.async_wait(boost::bind(&printer::print, this)); 

बढ़ावा :: बाँध देता है एक समारोह वस्तु जिसके लिए वर्ग प्रिंटर के लिए विधि प्रिंट को संदर्भित करता है ऑब्जेक्ट द्वारा संदर्भित यह। इस फ़ंक्शन ऑब्जेक्ट को त्रुटि पैरामीटर के साथ async_wait विधि द्वारा बुलाया जाता है (क्योंकि वह हस्ताक्षर है जो अपेक्षा करता है)। लेकिन त्रुटि पैरामीटर को चुपचाप अनदेखा किया जाता है क्योंकि इसे बाइंड द्वारा संदर्भित नहीं किया जाता है।

आधिकारिक boost::bind documentation बूस्ट :: बाइंड पर अधिक जानकारी प्रदान करता है। लेख How the Boost Bind Library Can Improve Your C++ Programs भी देखें (शायद कई और लेख उपलब्ध हैं लेकिन मुझे यह बहुत उपयोगी लगता है)।

2

प्लेसहोल्डर का उपयोग करके आप अपने कॉलबैक फ़ंक्शन के पैरामीटर के रूप में async_wait को कॉल में निर्दिष्ट करते हैं। आपके द्वारा लिंक किए गए पृष्ठ पर async_wait कॉल के ठीक ऊपर वाक्य की जांच करें:

आप ध्यान दें कि boost :: asio :: प्लेसहोल्डर्स :: त्रुटि प्लेसहोल्डर यहां निर्दिष्ट नहीं है, क्योंकि प्रिंट सदस्य फ़ंक्शन त्रुटि स्वीकार नहीं करता है एक पैरामीटर के रूप में वस्तु।

this example में "प्लेसहोल्डर" के लिए खोजें और आप देखेंगे कि यह कैसे करें।

संबंधित मुद्दे