c++ - boost::ref and boost::asio completion handlers, pass-by-reference -
m_io_service.post (बढ़ावा :: रेफरी (i)); मुझे इस कोड के एक भाग में कॉल है, अंतर्निहित प्रकार i निश्चित रूप से एक दायित्व है (क्योंकि बढ़ावा को दूर करना: रेफरी मूल्य से गुजरता है, जो ठीक काम करता है), हालांकि रगड़ मुझे बताता है कि: /opt/dev_64_swat/proto-rpc2/dependencies/boost/include/boost/asio/handler_invoke_hook.hpp:64:3: त्रुटि: Type 'boost :: reference_wrapper & lt; rubble :: rpc :: TcpFrontEndConnectionInvoker & gt;' कॉल ऑपरेटर प्रदान नहीं करता मैं संदर्भ से कैसे पारित करूं, मेरे पास ऑब्जेक्ट्स हैं जो एसिंक्रोनस कॉल से अधिक निकलती हैं, और वे अधिक सुरुचिपूर्ण (कम बढ़ावा :: साझा_पीटीआर & lt; .. & gt; अगर मैं उन्हें संदर्भ से पास कर सकता हूं)।
- संपादित करें - मैंने एएसआईओ की उदाहरण निर्देशिका के माध्यम से गहराया है, और बढ़ावा :: रिफ़ पूरा संचालक के लिए नहीं दिखाया गया है तो मुझे लगता है कि मैं यहाँ भाग्य से बाहर हूं। क्या कोई कारण है कि हैंडलरों का संस्करण रेफरी को स्वीकार नहीं करता है? - 2 संपादित करें: मुझे जो दिखता है (जब तक कि आप कार्यान्वयन के बारे में संदेह नहीं करते हैं) इस पर ध्यान न दें। - <पूर्व> नामस्थान रिक्त {नामस्थान आरपीसी {} इनप्रक्रिया इनोवॉकर: सार्वजनिक आमंत्रणबैज {संरचना अधिसूचना_बाइज_ {typedef notification_object_ * ptr; Notification_object_ () {रीसेट (); } शून्य रीसेट () {तैयार = गलत; } बूल तैयार; Boost :: mutex mutex; Boost :: condition_variable cond; }; InProcessInvoker (बैकएंड एंड बी_इन): बी (बी_आईएन), अधिसूचना_ऑब्जेक्ट (नया अधिसूचना_ऑब्जेक्ट_ ()) {बी.कनेक्ट (एम_क्लेन्ट_डेटा); } ~ InProcessInvoker () {if (m_client_data.unique ()) {b.disconect (m_client_data); Notification_object को हटाएं; }} Bool is_useable () {वापसी b.is_useable (); } शून्य रीसेट () {notification_object- & gt; रीसेट (); m_client_data- & gt; अनुरोध () स्पष्ट ()।; m_client_data- & gt; प्रतिक्रिया () स्पष्ट ()।; m_client_data- & gt;। error_code त्रुटि () स्पष्ट (); BOOST_ASSERT_MSG (m_client_data- & gt; is_rpc_active () == गलत, "आरपीसी के लिए किसी वस्तु को रीसेट करते समय आरपीसी को सेट नहीं किया जाना चाहिए"); } शून्य आमंत्रण () {b.invoke (* this); } शून्य ऑपरेटर () () () सेवा- & gt; प्रेषण (* client_cookie, * m_client_data); b.end_rpc (m_client_data.get ()); को बढ़ावा देने :: lock_guard & LT; बढ़ावा देने :: म्युटेक्स & gt; ताला (notification_object- & gt; म्युटेक्स); notification_object- & gt; तैयार = true notification_object- & gt; cond.notify_one (); } Void after_post () {boost :: unique_lock & lt; boost :: mutex & gt; ताला (notification_object- & gt; म्युटेक्स); यदि (! अधिसूचना- वस्तु- & gt; तैयार) सूचना_ऑब्जेक्ट- & gt; cond.wait (लॉक); } सूचना_ऑब्जेक्ट _ :: ptr सूचना_ऑब्जेक्ट; पिछला & amp; ख; }; }}
बढ़ावा :: संदर्भ प्रदान नहीं करता है ऑपरेटर () का अधिभार। इसलिए, वापसी को सीधे कॉलबैक के रूप में इस्तेमाल नहीं किया जा सकता है। 2 विकल्प हैं: -
सी +0 03: रेफरी को लपेटने के लिए boost :: bind का उपयोग करें, और यह जो आप चाहते हैं वह करेगा m_io_service.post (boost :: bind & lt; returnType & gt; (boost :: ref (i))) ध्यान दें कि आपको रिटर्न प्रकार निर्दिष्ट करना होगा जब तक कि मूल कष्टदाता i में result_type -
सी ++ 11 के लिए एक टाइप टाइप किया गया है: std :: ref < m_io_service.post (std :: ref (i)) / Li>
Comments
Post a Comment